2
$\begingroup$

I was wondering if there is a way to avoid for loop here:

I want to define a 4d matrix H(i,j,k,l), and each entry in the matrix is calculated through a complex function, say Do_H(i,j,k,l), depending on the index i, j, k, l.

Then I want to squeeze the 4d matrix to a 2d one, in the form below,

H(0,0,0,0)  H (0,0,0,1) ... H(0,0,0,N)... H(0,0,1,0) ... H(0,0,N,N)
H(0,1,0,0)  H (0,1,0,1) ... H(0,1,0,N)... H(0,1,1,0) ... H(0,1,N,N)
...
...
H(N,N,0,0)  H (N,N,0,1) ... H(N,N,0,N)... H(N,N,1,0) ... H(N,N,N,N)

as a (N^2) by (N^2) size matrix. N is predefined.

Thanks!

UPDATE: Sorry if I confused you. There are two questions here:

  1. How to calculate each entry without going through the for loop?
  2. How to reshape the matrix?
$\endgroup$
0

2 Answers 2

3
$\begingroup$
Clear[arrayH]
arrayH[n_Integer] := Partition[
  Flatten[Array[H, {n + 1, n + 1, n + 1, n + 1}, {0, 0, 0, 0}]],
  (n + 1)^2
]

arrayH[3]

symbolic

Then define an appropriate function H that calculates the value of each item using the indices. By way of example, if you had defined a function:

Clear[H]
H[i_, j_, k_, l_] := StringJoin @@ (ToString /@ {i, j, k, l})

Then

arrayH[3]

Mathematica graphics


Similarly, instead of Flatten and Partition, you can use ArrayReshape to obtain the result in a single operation:

ArrayReshape[
  Array[H, {n + 1, n + 1, n + 1, n + 1}, {0, 0, 0, 0}],
  {(n + 1)^2, (n + 1)^2}
]
$\endgroup$
1
  • $\begingroup$ Wow, this is amazing! $\endgroup$
    – James LT
    Commented Apr 28, 2016 at 18:31
2
$\begingroup$

Also:

ClearAll[f1, f2, f3, f4]
f1 = Partition[# @@@ Tuples[Range[0, #2], #2 + 1], (#2 + 1)^2] &;
f2 = Partition[Tuples[# @@ Range[0, #2], #2 + 1], (#2 + 1)^2] &;
f3 = ArrayReshape[# @@@ Tuples[Range[0, #2], #2 + 1], {#2 + 1, #2 + 1}^2] &;
f4 = ArrayReshape[Tuples[# @@ Range[0, #2], #2 + 1], {#2 + 1, #2 + 1}^2] &;

f1[H, 3] == f2[H, 3] == f3[H, 3] == f4[H, 3] == arrayH[3]

True

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.