Re: Efficient Replacement Rules to Matrix?
- To: mathgroup at smc.vnet.net
- Subject: [mg21779] Re: [mg21743] Efficient Replacement Rules to Matrix?
- From: "Tomas Garza" <tgarza at mail.internet.com.mx>
- Date: Thu, 27 Jan 2000 22:57:01 -0500 (EST)
- Sender: owner-wri-mathgroup at wolfram.com
Roger Jones [rmj at leland.stanford.edu] wrote:
> What is the most efficient (in terms of time) method to transform a set
> of replacement rules to a matrix. For example, I have:
>
> matrix = ZeroMatrix[5];
> repmat = {{1, 1} -> 4., {5, 5} -> 3,{4, 4} -> 10,{2, 2} -> 2 + I 6, {3,
> 3} -> 40.};
>
> and I transfor to a matrix thus:
>
> matrix = ReplacePart[matrix, Sequence @@ #]) & /@ (
> {Last[#], #[[1]]} & /@ matrix);
>
> But for large matrices this is quite slow! Is there a more efficient
> method?
Perhaps there are a couple of misprints in the expression for matrix above?
I guess (correct me if I'm wrong) it should read
matrix = (ReplacePart[matrix, Sequence @@ #]) & /@ (
{Last[#], #[[1]]} & /@ repmat);
Notice the left parenthesis before ReplacePart, and repmat instead of matrix
at the end of the expression. If so, I think the problem is - partly - that
you end up with a huge matrix of dimensions {5, 5, 5}. From this, one has to
select those elements which really correspond to the desired matrix. I would
suggest a slightly different approach:
In[1]:=
f[m_, j_] := ReplacePart[m, Sequence[repmat[[j, 2]]], repmat[[j, 1]]]
In[2]:=
matrix = Fold[f, matrix, {1, 2, 3, 4, 5}]
Out[2]=
{{4., 0, 0, 0, 0}, {0, 2 + 6 I, 0, 0, 0}, {0, 0, 40., 0, 0}, {0,
0, 0, 10, 0}, {0, 0, 0, 0, 3}}
No doubt this is much faster (I was too lazy to perform actual numeric
experiments with larger matrices), since it always remains within the {5, 5}
dimensions of the original matrix.
Tomas Garza
Mexico City