Re: Using implicit information about row indices
- To: mathgroup at smc.vnet.net
- Subject: [mg68299] Re: Using implicit information about row indices
- From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
- Date: Tue, 1 Aug 2006 06:59:11 -0400 (EDT)
- Organization: The Open University, Milton Keynes, UK
- References: <eakcj6$qce$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Diamond, Mark wrote: > I am wanting to fill a square matrix M (say, r by r) using information from > a list, L. > The list L is also of length r, but is not a square matrix. It contains > lists of ordered pairs {col, num} > It typically looks something like this; I have arranged it into rows so that > it is more obvious > { > {{1, a}, {2, b}}, > > {{1, c}, {2, d}, {3, e}, {4, f}}, > > {{2, g}, {3, h}, {4, i}}, > > {{3, k}, {4, l}, {5,m}}, > > {{4, n}, {5, p}} > > } > > Now what I am trying to do is, for example, set M[[1,1]]=a, M[[1,2]]=b, > M[[2,1]]=c, M[[2.2]]=d, M[[2,3]]=e and so forth, and leave (or set) all the > other entries in M to zero. The row information for M is implicit in the > structure of the list L; additionally, the column indices as they appear > within sublist of L are guraranteed to be sequential. It seems with all this > info, there should be an easy way to fill M correctly, but I have struggled > without success to do anything other than an iterative process with Do[]. I > would appreciate any guidance you might have. Hi Mark, You could use a SparseArray to build the matrix. In the following expression, MapIndexed is used to build a new list where each row contains its row number as first element. Then, this row number is inserted before each pair of original elements. The resulting list is flatten out and partitioned in triples that hold {row, column, value}. Finally, these triples are transformed in replacement rules that are expected by SparseArray. Normal gives you a regular matrix. L = {{{1, a}, {2, b}}, {{1, c}, {2, d}, {3, e}, {4, f}}, {{2, g}, {3, h}, {4, i}}, {{3, k}, {4, l}, {5, m}}, {{4, n}, {5, p}}}; Normal[ SparseArray[ Partition[ Flatten[ (Insert[Flatten[Rest[#1], 1], First[#1], Table[{i}, {i, 1, Length[Flatten[Rest[#1]]] - 1, 2}]] & ) /@ MapIndexed[Insert[#1, #2, 1] & , L]], 3] /. {x_, y_, z_} -> {x, y} -> z ]] returns a b 0 0 0 c d e f 0 0 g h i 0 0 0 k l m 0 0 0 n p Best regards, Jean-Marc