PDA

View Full Version : Defining one matrix in terms of another in Mathematica with FOR loop


AxiomOfChoice
Oct24-11, 11:39 AM
THIS ISN'T WORKING AT ALL!

I'm trying to define a matrix M in terms of a predefined matrix N by using the following for loop:

For[a=1,a<=12,a++,M[[a,a]]=N[[1,a]]]

So I just want the diagonal of M to be the first row of N. But this is not working at ALL. Does anyone see what I'm doing wrong?

Simon_Tyler
Oct25-11, 07:26 PM
First of all, N is a built in command (http://reference.wolfram.com/mathematica/ref/N.html), N[Pi]=3.1415...
If you want to use a symbol that looks like N, the easiest is \[CapitalNu] that can be entered using <esc>N<esc>.

Second, you need to set the off diagonal elements of M, not just the diagonal.

Finally, it's more efficient to use built in matrix/array methods than using For loops.

Here's a 12*12 random integer matrix and a 12*12 zero matrix:

Mat1 = RandomInteger[{-10, 10}, {12, 12}];
Mat2 = ConstantArray[0, {12, 12}];

To implement a loop like the one that you wanted, try

Do[Mat2[[a, a]] = Mat1[[1, a]], {a, 1, Length@Mat2}]

Ouput the matrix and check that it's correct:


Mat2 // MatrixForm
Diagonal[Mat2] == First[Mat1]

(* Returns (for the particular random matrix that I got):
-1 0 0 0 0 0 0 0 0 0 0 0
0 9 0 0 0 0 0 0 0 0 0 0
0 0 -4 0 0 0 0 0 0 0 0 0
0 0 0 -2 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 2 0 0 0 0 0 0
0 0 0 0 0 0 2 0 0 0 0 0
0 0 0 0 0 0 0 9 0 0 0 0
0 0 0 0 0 0 0 0 9 0 0 0
0 0 0 0 0 0 0 0 0 -4 0 0
0 0 0 0 0 0 0 0 0 0 3 0
0 0 0 0 0 0 0 0 0 0 0 7

True *)


Probably the best way to create the matrix Mat2 would be to use

DiagonalMatrix[First@Mat1]

But other options are


IdentityMatrix[12] First[Mat1]
Array[If[#1 == #2, Mat1[[1, #]], 0] &, {12, 12}]
Array[KroneckerDelta[##] Mat1[[1, #]] &, {12, 12}]
SparseArray[Band[{1, 1}] -> First@Mat1, {12, 12}] // Normal
(* etc... *)


See the Constructing matrices guide (http://reference.wolfram.com/mathematica/guide/ConstructingMatrices.html) and tutorial (http://reference.wolfram.com/mathematica/tutorial/ConstructingMatrices.html) for more info.