1

ループを使用しないように最善を尽くしています。しかし、ループを使用する以外に解決するのは非常に難しいと思います。ループコードをベクトル化することは可能ですか?ありがとう

a=[0.1361,0.8530,0.0760;0.8693,0.6221,0.2399;0.5797,0.3510,0.1233;.5499,0.5132,0.1839; 0.1450,0.4018,0.2400];
b=[0.4173,0.4893,0.7803;0.0497,0.3377,0.3897;0.9027,0.9001,0.2417;0.9448,0.3692,0.4039;0.4909,0.1112,0.0965];
[m1,n1,l]=size(a);
awe=-0.5;
g = [81.2379 92.4675;92.4675 118.1451];
ver=inv(g);
p=zeros(m1,n1);
for i=1:m1
for j=1:n1
    CD=[a(i,j) ; b(i,j)]
    p(i,j)= CD'*ver* CD;
end
end
q = exp(awe*p);
4

2 に答える 2

3

行列pを複数のコンポーネントに分割すると、次の方法で計算をベクトル化できます。

p = a .^ 2 * ver(1, 1) + a .* b * (ver(1, 2) + ver(2, 1)) + b .^ 2 * ver(2, 2);

または、次のようにソリューションを一般化できます。

CD = [a(:), b(:)]';
p = reshape(diag(CD' * ver * CD), size(a));

ただし、これは少し遅いソリューションであることに注意してください。

于 2013-03-04T17:32:27.130 に答える
1

もちろんできます。

CD = reshape(diag([a(:),b(:)]*ver*[a(:),b(:)]'),5,3);

ただし対角線のみ

[a(:),b(:)]*ver*[a(:),b(:)]' 

が必要です。

だから交換

diag([a(:),b(:)]*ver*[a(:),b(:)]')

と:

sum(  [a(:),b(:)]'  .*  (ver*[a(:),b(:)]') , 1)'
于 2013-03-04T17:32:12.513 に答える