【问题标题】:Avoiding a for loop in Matlab with Kronecker product使用 Kronecker 产品在 Matlab 中避免 for 循环
【发布时间】: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)。在我的“真实”脚本中,我使用了预分配和一些围绕它的附加操作。无论如何感谢您的信息

标签: matlab for-loop sequence


【解决方案1】:

这里reshapeimplicit expansion用于计算结果:

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

【讨论】:

  • 首先,这看起来像是正确的解决方案,但是,对于更高的维度,这会混淆......
  • @seaver 我回答了您问题的文本。可能您对更高维度有更多头脑问题?
  • 抱歉,不清楚,更高的维度可能不是最好的术语:P。我的意思是,对于 size(A,2)>1 和 size(B,2)>1 (例如分别为 2 和 4),您的输出与 for-loop 和 Kronecker 函数的输出不等价。我不确定如何...
  • 你可以试试online比较这两种方法。我看不出有什么不同。
  • 那我猜是长度L有问题:code
猜你喜欢
  • 2018-03-15
  • 2013-06-06
  • 1970-01-01
  • 2015-01-24
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多