# Defining one matrix in terms of another in Mathematica with FOR loop

• Mathematica
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?

## Answers and Replies

First of all, http://reference.wolfram.com/mathematica/ref/N.html" [Broken], 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:

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

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

Code:
Do[Mat2[[a, a]] = Mat1[[1, a]], {a, 1, [email protected]}]

Ouput the matrix and check that it's correct:

Code:
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

Code:
DiagonalMatrix[[email protected]]

But other options are

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

See the Constructing matrices http://reference.wolfram.com/mathematica/guide/ConstructingMatrices.html" [Broken] for more info.

Last edited by a moderator: