使用 Kronecker 产品避免 Matlab 中的 for 循环
Avoiding a for loop in Matlab with Kronecker product
如果我有两个序列 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 的克罗内克积。我想在 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
and implicit expansion是用来计算结果的:
C = reshape(B .* reshape (A, L, 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 的克罗内克积。我想在 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
and implicit expansion是用来计算结果的:
C = reshape(B .* reshape (A, L, 1, []), L, []);