我有一个与这篇文章相关的问题:"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
有人知道如何正确编写循环,或者更好的方法吗?
最佳答案
克朗
有几种方法可以做到这一点。最短的方法是使用 kron
按照 Adiel 在评论中建议的功能。
A = [1,2; 3, 4; 5, 6];
B = kron(A, [1;1]);
请注意,ones 向量中的元素数量控制每行的重复次数。对于 n
次,请使用 kron(A, Ones(n,1))
。
kron
计算克罗内克张量积,这不一定是一个快速过程,理解起来也不直观,但它确实给出了正确的结果!
reshape
和 repmat
更容易理解的过程可能涉及 reshape
和 repmat
的组合。目的是将矩阵 reshape 为行向量,重复所需的次数,然后再次 reshape 它以重新获得两列矩阵。
B = reshape(repmat(reshape(A, 1, []), 2, 1), [], 2);
请注意,repmat
函数中的 2
控制每行的重复次数。对于 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
选项:
0.0016622 秒repmat
/reshape
选项:
0.0012831 秒
不同尺寸的扩展基准:
摘要:
reshape
选项只需复制一次行,速度更快 (~25%),因此,如果您想最终得到每行 2 个的结果,则应该选择此选项一个大矩阵。对于行重复次数,
reshape
选项的复杂度似乎为 O(n)。kron
有一些初始开销,但是当您需要多次重复时,它会快得多,并且几乎不会因此而减慢!如果您要进行多次重复,请使用kron
方法。
关于matlab - 在 MATLAB 中重复矩阵行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45030081/