How to rewrite this high dimensional matrix calculation
    6 ビュー (過去 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 で Matrix Indexing についてさらに検索
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!


