我有一个与这篇文章有关的问题:"克隆"行或列向量.我试图解决那里发布的答案,但未能将它们应用到我的问题中.
就我而言,我想通过转换矩阵来"克隆"矩阵的每一行
A = [1,2; 3, 4; 5, 6]
Run Code Online (Sandbox Code Playgroud)
进入矩阵
B = [1, 2
1, 2
3, 4
3, 4
5, 6
5, 6]
Run Code Online (Sandbox Code Playgroud)
通过重复每一行A
多次.
到目前为止,我能够repmat
像单行一样工作
A = [1, 2];
B = repmat(A, 2, 1)
>> B = [1, 2
1, 2]
Run Code Online (Sandbox Code Playgroud)
我试图使用该公式构建循环,以获得所需的矩阵.循环看起来像
T = 3; N = 2;
for t = 1:T
for I = 1:N
B = repmat(C, 21, 1)
end
end
Run Code Online (Sandbox Code Playgroud)
有谁知道如何正确编写循环,或更好的方法来做到这一点?
kron
有几种方法可以做到这一点.最简单的方法是使用kron
Adiel在评论中建议的功能.
A = [1,2; 3, 4; 5, 6];
B = kron(A, [1;1]);
Run Code Online (Sandbox Code Playgroud)
请注意,1矢量中的元素数量控制每行重复的次数.对于n
次,连用kron(A, ones(n,1))
.
kron
计算kronecker张量积,这不一定是一个快速的过程,也不是直观的理解,但它确实给出了正确的结果!
reshape
和 repmat
更可以理解的过程中可能涉及的组合reshape
和repmat
.目的是将矩阵重新整形为行向量,重复所需的次数,然后再次重新整形以重新获得双列矩阵.
B = reshape(repmat(reshape(A, 1, []), 2, 1), [], 2);
Run Code Online (Sandbox Code Playgroud)
需要注意的是,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);
Run Code Online (Sandbox Code Playgroud)
输出:
kron
选项:repmat
/ reshape
选项:不同尺寸的扩展基准:
摘要:
reshape
只需复制一次行,选项就会更快(~25%),所以如果你想最终得到一个大矩阵的每一行2,你应该选择这个选项.
该reshape
选项似乎具有行重复次数的复杂度O(n).kron
有一些初步的开销,但多快,当你想多次重复,几乎没有减慢,因为他们的失望!kron
如果你做了几次重复,那就去找一下这个方法吧.