我有一个与此帖相关的问题:"Cloning" row or column vectors。我试图解决那里发布的答案,但未能将它们应用到我的问题中。
在我的情况下,我想"克隆"通过转换像
这样的矩阵,矩阵的每一行A = [1,2; 3, 4; 5, 6]
进入矩阵
B = [1, 2
1, 2
3, 4
3, 4
5, 6
5, 6]
重复A
的每一行。
到目前为止,我能够使用repmat
处理像
A = [1, 2];
B = repmat(A, 2, 1)
>> B = [1, 2
1, 2]
我试图使用该公式构建一个循环,以获得所需的矩阵。循环看起来像
T = 3; N = 2;
for t = 1:T
for I = 1:N
B = repmat(C, 21, 1)
end
end
有谁知道如何正确编写循环,或者更好的方法来执行此操作?
答案 0 :(得分:5)
kron
有几种方法可以做到这一点。最简单的方法是使用Adiel在评论中建议的kron
函数。
A = [1,2; 3, 4; 5, 6];
B = kron(A, [1;1]);
请注意,单个向量中的元素数量控制每行重复的次数。对于n
次,请使用kron(A, ones(n,1))
。
kron
计算kronecker张量积,它不一定是 fast 过程,也不是直观的理解,但它确实给出了正确的结果!
reshape
和repmat
更易理解的过程可能涉及reshape
和repmat
的组合。目的是将矩阵重新整形为行向量,重复所需的次数,然后再次重新整形以重新获得双列矩阵。
B = reshape(repmat(reshape(A, 1, []), 2, 1), [], 2);
请注意2
函数中的repmat
控制每行重复的次数。对于n
次,请使用reshape(repmat(reshape(A, 1, []), n, 1), [], 2)
。
可以编写快速基准:
% Setup, using a large A
A = rand(1e5, 2);
f = @() kron(A, [1;1]);
g = @() reshape(repmat(reshape(A, 1, []), 2, 1), [], 2);
% timing
timeit(f);
timeit(g);
输出:
kron
选项:repmat
/ reshape
选项:不同尺寸的扩展基准:
摘要:
reshape
选项更快(~25%),因为每次只复制行一次,所以如果你想最终得到每行2个大矩阵,你应该选择这个选项。
reshape
选项似乎具有行重复次数的复杂度O(n)。 kron
有一些初始开销,但是当你想要多次重复并且因为它们而几乎没有减速时,很多更快!如果您重复几次,请转到kron
方法。