У меня есть два многомерных массива, то есть A3D
и B3D
. Массив A3D
имеет размерность 2 x 2 x n
, а массив B3D имеет размерность m x 2 x n
. Каждая двумерная подмассива в A3D
является симметричной матрицей. Для каждого i
я хочу вычислить B3D[:,:,i]* A3D[:,:,i]* transpose(B3D[:,:,i])
. Результат затем сохраняется в многомерном массиве. Я попробовал следующие коды Джулии, чтобы выполнить задачу. Однако время вычислений с моими кодами составило около 4 с, что довольно медленно. Мне интересно, можно ли улучшить производительность моих кодов. Ниже приведены мои коды Джулии. Спасибо за внимание к моей проблеме.
m = 100;
n = 30_000; # this could be a very large number.
A3D = rand(2,2,n);
[A3D[:,:,i] = Symmetric(A3D[:,:,i]) for i in 1:n];
B3D = rand(m,2,n);
res3D = zeros(m,m,n);
# approach 1
@time [res3D[:,:,i] = eB*eA*transpose(eB)
for (eA, eB, i) in zip(eachslice(A3D,dims=3),eachslice(B3D,dims=3),1:n)];
UPDATE:
Я добавил другой подход для решения своей проблемы (см. Ниже). Подход 2 немного лучше, чем подход 1. Но можем ли мы еще улучшить производительность моего кода?
# approach 2
@inbounds for i = 1:n
res3D[:,:,i] = B3D[:,:,i]*A3D[:,:,i]*B3D[:,:,i]';
end