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.
vBulletin® v3.8.7, Copyright ©2000-2012, vBulletin Solutions, Inc.