matlab - 在 MATLAB 中重复矩阵行

标签 matlab matrix

我有一个与这篇文章相关的问题:"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 计算克罗内克张量积,这不一定是一个快速过程,理解起来也不直观,但它确实给出了正确的结果!

<小时/>

reshaperepmat

更容易理解的过程可能涉及 reshaperepmat 的组合。目的是将矩阵 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 秒

不同尺寸的扩展基准:

benchmark

摘要:

  • reshape 选项只需复制一次行,速度更快 (~25%),因此,如果您想最终得到每行 2 个的结果,则应该选择此选项一个大矩阵。

  • 对于行重复次数,reshape 选项的复杂度似乎为 O(n)。 kron 有一些初始开销,但是当您需要多次重复时,它会快得多,并且几乎不会因此而减慢!如果您要进行多次重复,请使用 kron 方法。

关于matlab - 在 MATLAB 中重复矩阵行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45030081/

相关文章:

matlab - 使用 Matlab 进行 Windows 自动化

algorithm - 如何查找排序矩阵中是否存在数字?

python - 将 sympy 表达式分解为矩阵系数?

Python:对二维数组(列表列表)中的元素执行操作的单行代码?

将 .mat 文件转换为任何其他格式,例如 .txt 或 .plist

matlab - 在matlab中使用linspace

matlab - 在 MATLAB GUI 中显示结果

matlab - 如何将符号包中的符号表达式转换为 Octave 函数?

java - 用Java或C将1010存储在矩阵中

OpenCV:Mat 对象从什么索引开始?