How to rewrite this high dimensional matrix calculation
3 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Hancheng Zhu
am 9 Okt. 2024
Kommentiert: Hancheng Zhu
am 10 Okt. 2024
Here is the code:
X = randn(A,B,C);
Z = zeros(A,B,A,B,C);
for a=1:A
for b=1:B
Z(a,b,:,:,:) = X - X(a,b,:);
Z(a,b,a,b,:) = X(a,b,:);
end
end
X is a given three dimensional matrix with dimension A*B*C, i want to obtain the 5 dimension matrix Z. I am not familiar with the high dimension matrix manipulation so i just write with for loop, but it is really time-consuming. Is there any way to accelerate the calculation of Z?
0 Kommentare
Akzeptierte Antwort
Bruno Luong
am 9 Okt. 2024
Bearbeitet: Bruno Luong
am 9 Okt. 2024
Fully vectorized
Y = reshape(X, [], 1, C);
Z = reshape(Y, 1, [], C)-Y;
Z = reshape(Z, [], C);
Z(1:A*B+1:end,:) = Y;
Z = reshape(Z,[A B A B C]);
5 Kommentare
Bruno Luong
am 10 Okt. 2024
Bearbeitet: Bruno Luong
am 10 Okt. 2024
Y = reshape(X, A, 1, []);
Z = reshape(X, 1, A, [])-Y;
Z = reshape(Z, [], B*C);
Z(1:A+1:end,:) = Y;
Z = reshape(Z,[A A B C]);
S = reshape(prod(Z,2), [A B C]);
I recommend to keep your original code; at least as comment while you don't fully master the vectorized version, which is not obviously clear.
Weitere Antworten (1)
Zinea
am 9 Okt. 2024
Bearbeitet: Zinea
am 9 Okt. 2024
To accelerate the calculation of the 5-dimensional matrix Z, you can make the following changes:
- Preallocate the matrix Z with zeros.
Z = zeros(A, B, A, B, C);
2. Use reshape to manipulate the dimensions of X. Also, element-wise operations is used to compute the difference for each element in X without explicit loops.
X_expanded = reshape(X, [1, 1, A, B, C]);
Z = X_expanded - reshape(X, [A, B, 1, 1, C]);
You may refer to the following documention on vectorization for more information:
3. A loop is still used to assign values where the indices of Z match (a,b) in the 3rd and 4th dimensions, but this is a relatively small operation compared to the entire matrix computation.
for a = 1:A
for b = 1:B
Z(a, b, a, b, :) = X(a, b, :);
end
end
0 Kommentare
Siehe auch
Kategorien
Mehr zu Creating and Concatenating Matrices finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!