How to rewrite this high dimensional matrix calculation
2 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Hancheng Zhu
el 9 de Oct. de 2024
Comentada: Hancheng Zhu
el 10 de Oct. de 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 comentarios
Respuesta aceptada
Bruno Luong
el 9 de Oct. de 2024
Editada: Bruno Luong
el 9 de Oct. de 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 comentarios
Bruno Luong
el 10 de Oct. de 2024
Editada: Bruno Luong
el 10 de Oct. de 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.
Más respuestas (1)
Zinea
el 9 de Oct. de 2024
Editada: Zinea
el 9 de Oct. de 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 comentarios
Ver también
Categorías
Más información sobre Creating and Concatenating Matrices en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!