Services & Resources / Wolfram Forums
-----
 /
MathGroup Archive
2006
*January
*February
*March
*April
*May
*June
*July
*August
*September
*October
*November
*December
*Archive Index
*Ask about this page
*Print this page
*Give us feedback
*Sign up for the Wolfram Insider

MathGroup Archive 2006

[Date Index] [Thread Index] [Author Index]

Search the Archive

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


  • Prev by Date: Re: Using implicit information about row indices
  • Next by Date: Re: x=2;Composition[f,FindMinimum][x+1,{x,a}]
  • Previous by thread: Re: Re: Using implicit information about row indices
  • Next by thread: Re: Using implicit information about row indices