【发布时间】:2020-11-18 11:08:34
【问题描述】:
如果我有两个序列 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
【问题讨论】:
-
要明确一点:至少从 5 年前开始,MATLAB 中的 For 循环并不慢。不再有实际理由(除了风格)来避免它们。缓慢的是您没有预先分配
C2并且它会增加每个循环的大小。 -
syms如果你不需要它也很慢,不清楚为什么这里需要符号工具箱,一个简单的数字示例会有所帮助 -
@AnderBiguri 啊,我不知道!未预先分配的
C2是为了示例,就像syms(@Wolfie)。在我的“真实”脚本中,我使用了预分配和一些围绕它的附加操作。无论如何感谢您的信息