用Kronecker积避免Matlab中的for循环

用Kronecker积避免Matlab中的for循环,matlab,for-loop,sequence,Matlab,For Loop,Sequence,如果我有两个序列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

如果我有两个序列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
此处和用于计算结果:

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

需要明确的是:至少从5年前开始,For循环在MATLAB中并不慢。再也没有实际的理由(除了风格)去避免它们了。慢的是,您没有预先分配
C2
,它会增加每个循环的大小。
syms
如果您不需要它,它也慢,不清楚为什么这里需要符号工具箱,一个简单的数字示例可能会help@AnderBiguri啊,我不知道!未预分配的
C2
是为了示例,就像
syms
(@Wolfie)一样。在我的“真实”脚本中,我使用了预分配和一些附加操作。不管怎样,谢谢你提供的信息。首先,这看起来是正确的解决方案,但是,对于更高的维度,这会混淆东西…@seaver我回答了你的问题。可能您还有更多关于高维的问题?抱歉,这还不清楚,高维可能不是最好的术语:P。我的意思是,对于大小(A,2)>1和大小(B,2)>1(分别为2和4),您的输出与for循环和Kronecker函数的输出不相等。我不知道如何…你可以尝试比较这两种方法。我看不出有什么不同。那么我猜长度L有问题: