我有一個等式要計算,看起來像這樣:
F(a,b) = sum(c=1...n, a*b*c[i])
我可以這樣算:
for a=
for b=
for c=
F(a,b)=F(a,b) a*b*c
end
end
end
但我聽說,在大陣列上,matlab 在嵌套回圈上“凍結”。所以我可以這樣做:
a=(1:n)';
b=1:n2;
Fs=a*b;
for c=
F=F Fs*c;
end
但我想在沒有任何可見回圈的情況下解決這個問題。所以我可以創建三個正交陣列 a,b,c 張量乘積它們以獲得 3-D 陣列,然后使用第三維求和函式。
a(:,1,1)=1:3;
b(1,:,1)=4:6;
c(1,1,:)=7:9;
d=tensorprod (a,b,2,1)
e=tensorprod (d,c);
但是我在matlab中遇到了張量乘法問題。e
必須是 3x3x3 陣列,但它是 3x3x1x1x3 陣列。這是正確的,所有的,甚至
g=sum(e,5);
回傳矩陣,但我不明白為什么第三維已經移動到第五維
uj5u.com熱心網友回復:
我不確定無回圈版本是否更好。使用廣播(Matlab 從 Fortran 和 numpy 中獲取),你可以在沒有回圈的情況下做到這一點,但我認為 matlab 的 java JIT 編譯器可以通過簡單的回圈提供更好的結果,但是,無回圈版本可能是
n2=3;
n2=4;
n3=5;
a=1:n1;
b=1:n2;
Fs=a'.*b;
F=zeros(size(Fs))
for c=1:n3
F=F Fs*c;
end
# the broadcast : all dimensions equal to one will be duplicate
# for the other tensor : after that we contract the tensor along the
# third dimension
F2 = sum(Fs(:,:,1) .* reshape(1:n3,1,1,5), 3)
norm(F2-F,2)
uj5u.com熱心網友回復:
根據您的回圈,這應該給出所需的總和。
a = 1:3;
b = 4:6;
c = 7:9;
F = a' * b * sum(c)
F =
96 120 144
192 240 288
288 360 432
uj5u.com熱心網友回復:
您可以使用向量和點積(內積)來做到這一點:
a=1:3;
b=4:6;
c=7:9;
D=dot(a,b);
E=sum(D*c)
E =
768
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/507945.html
下一篇:系統地從單元格中洗掉字串