使用Kronecker产品避免Matlab中的for循环



如果我有两个序列A和B,包含元素a1、a2。。。和b1,b2。。。其中a_i和b_i分别具有维度1xn和1xm,则我想要制作一个新的序列C,该序列包含:a_i(1(*b_i,a_i(2(*b_i,a_i(n(*b_i。所以对于C的第I个元素,我想得到元素a_I和b_I的Kronecker乘积。我想在Matlab中对此进行编码,但没有for循环。对于b_i是标量的情况,使用可以获得所需的结果

C = A.*B

然而,这对非标量b_i不起作用。所以我现在做的是长度为L:的序列

C = [];
for ii = 1:L
C = [C; kron(A(ii,:),B(ii,:))];
end

但我认为,如果没有for循环,这一定是可能的。这是我使用符号工具箱的代码:

clc; clear;
L = 5;
syms('a1',[L,1]);
syms('a2',[L,1]);
syms('b1',[L,1]);
syms('b2',[L,1]);
A = [a1,a2];
B = [b1,b2];
C1 = A.*B % only for size(B,2)=1
C2 = [];
for ii = 1:L
C2 = [C2;kron(A(ii,:),B(ii,:))];
end
C2
C3 = kron(A,B) % does not work

这里reshape和隐式展开用于计算结果:

C = reshape(B .* reshape (A, L, 1, []), L, []);

相关内容

  • 没有找到相关文章

最新更新