matlab 3个数组的Tensor积

ymdaylpp  于 2022-11-24  发布在  Matlab
关注(0)|答案(3)|浏览(168)

我有一个等式要计算,它看起来像这样:

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,cTensor积他们得到三维阵列,然后使用和函数的第三维。

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中遇到了Tensor乘法问题。e必须是3x3x3数组,但它是3x3x1x1x3数组。它是正确的,甚至

g=sum(e,5);

返回矩阵,但我不明白为什么第三维移到了第五维

jv4diomz

jv4diomz1#

我不确定无循环版本是否更好。使用广播(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)
chy5wohz

chy5wohz2#

根据您的循环,这应该会给予所需的总和。

a = 1:3;
b = 4:6;
c = 7:9;
F = a' * b * sum(c) 

F = 
    96   120   144
   192   240   288
   288   360   432
eaf3rand

eaf3rand3#

您可以使用向量和点积(内积)来执行此操作:

a=1:3;
b=4:6;
c=7:9;
D=dot(a,b);
E=sum(D*c)

E =

   768

相关问题