How to rewrite this high dimensional matrix calculation
3 次查看(过去 30 天)
显示 更早的评论
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 个评论
采纳的回答
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
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.
更多回答(1 个)
Zinea
2024-10-9
编辑:Zinea
2024-10-9
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 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Creating and Concatenating Matrices 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!