Ax, Ay, Az: [N-by-N]
B=AA (диадический продукт)
Это значит :
B(i,j)= [Ax(i,j);Ay(i,j);Az(i,j)]*[Ax(i,j) Ay(i,j) Az(i,j)]
B(i,j): матрица 3x3. Один из способов построить B:
N=2;
Ax=rand(N); Ay=rand(N); Az=rand(N); %# [N-by-N]
t=1;
F=zeros(3,3,N^2);
for i=1:N
for j=1:N
F(:,:,t)= [Ax(i,j);Ay(i,j);Az(i,j)]*[Ax(i,j) Ay(i,j) Az(i,j)];
t=t+1; %# t is just a counter
end
end
%# then we can write
B = mat2cell(F,3,3,ones(N^2,1));
B = reshape(B,N,N)';
B = cell2mat(B);
Есть ли более быстрый способ, когда N велико.
Редактировать:
Спасибо за Ваш ответ. (так быстрее) Положим: N=2; Ах=[1 2;3 4]; Ау=[5 6;7 8]; Аз=[9 10;11 12];
B =
1 5 9 4 12 20
5 25 45 12 36 60
9 45 81 20 60 100
9 21 33 16 32 48
21 49 77 32 64 96
33 77 121 48 96 144
Выполнить:
??? Ошибка при использовании ==> mtimes Внутренние размеры матрицы должны совпадать.
Если я напишу :P = Ai*Aj;
то
B =
7 19 31 15 43 71
23 67 111 31 91 151
39 115 191 47 139 231
10 22 34 22 50 78
34 78 122 46 106 166
58 134 210 70 162 254
Это отличается от указанного выше A(:,:,1) отличается от [Ax(1,1) Ay(1,1) Az(1,1)]
Редактировать:
N=100;
Me :Elapsed time is 1.614244 seconds.
gnovice :Elapsed time is 0.056575 seconds.
N=200;
Me :Elapsed time is 6.044628 seconds.
gnovice :Elapsed time is 0.182455 seconds.
N=400;
Me :Elapsed time is 23.775540 seconds.
gnovice :Elapsed time is 0.756682 seconds.
Fast!
rwong: B was not the same.
Редактировать:
После некоторой модификации для моего приложения: кодами gnovice
1st code : 19.303310 seconds
2nd code: 23.128920 seconds
3rd code: 13.363585 seconds
Кажется, что любой вызов функции, такой как ceil, ind2sub ..., замедляет циклы и их следует избегать, если это возможно.
symIndex
было интересно! Спасибо.