Re: VectorToMatrix

*To*: mathgroup at smc.vnet.net*Subject*: [mg4373] Re: VectorToMatrix*From*: Paul Abbott <paul at physics.uwa.edu.au>*Date*: Mon, 15 Jul 1996 07:01:10 -0400*Organization*: University of Western Australia*Sender*: owner-wri-mathgroup at wolfram.com

Robert Pratt wrote: > I want to define a function VectorToMatrix[list_, n_] that behaves as > follows: > > VectorToMatrix[{a,b,c,d,e,f,g,h,i,j}, 4]//MatrixForm > > 0 a b c d > 0 0 e f g > 0 0 0 h i > 0 0 0 0 j > > Now n can be determined from Length[list], which will always be equal > to n choose 2 for some n. But I would rather input n to save that > computation. (I will be doing this for a lot of vectors.) See The Mathematica Journal 4(1):34. That example converts a vector into a symmetric matrix. It is easy to modify this example to meet your needs: To convert a vector into a symmetric matrix, note that an m x m symmetric matrix corresponds to a vector of length m(m+1)/2 (a so- called traingular number). Inverting this formula: In[1]:= dim[n_] = (m /. Solve[m(m+1)/2 == n, m] // Last) Out[1]= -1 + Sqrt[1 + 8 n] ------------------ 2 In[2]:= vec = {a,b,c,d,e,f,g,h,i,j}; In[3]:= dim[Length[vec]] Out[3]= 4 This is fast so you might as well compute it. In[4]:= VectorToMatrix[vec_ /; IntegerQ[dim[Length[vec]]]] := Module[{m = dim[Length[vec]],i,j}, Table[If[i>=j,0,vec[[j + (i-1)(m-i/2)-1]]], {i, m}, {j, m+1} ]] In[5]:= VectorToMatrix[vec] // MatrixForm Out[17]//MatrixForm= 0 a b c d 0 0 e f g 0 0 0 h i 0 0 0 0 j Cheers, Paul _________________________________________________________________ Paul Abbott Department of Physics Phone: +61-9-380-2734 The University of Western Australia Fax: +61-9-380-1014 Nedlands WA 6907 paul at physics.uwa.edu.au AUSTRALIA http://www.pd.uwa.edu.au/Paul _________________________________________________________________ ==== [MESSAGE SEPARATOR] ====