How to rewrite this high dimensional matrix calculation

조회 수: 2 (최근 30일)
Hancheng Zhu
Hancheng Zhu 2024년 10월 9일
댓글: Hancheng Zhu 2024년 10월 10일
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?

채택된 답변

Bruno Luong
Bruno Luong 2024년 10월 9일
편집: Bruno Luong 2024년 10월 9일
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
Bruno Luong
Bruno Luong 2024년 10월 10일
편집: Bruno Luong 2024년 10월 10일
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.
Hancheng Zhu
Hancheng Zhu 2024년 10월 10일
This really helps me a lot, thanks for your answer.

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Zinea
Zinea 2024년 10월 9일
편집: Zinea 2024년 10월 9일
To accelerate the calculation of the 5-dimensional matrix Z, you can make the following changes:
  1. 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

카테고리

Help CenterFile Exchange에서 Creating and Concatenating Matrices에 대해 자세히 알아보기

제품


릴리스

R2024b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by