【发布时间】:2018-05-02 09:41:48
【问题描述】:
在 Matlab 中,我在 2x249 矩阵中有两个单行 (1x249) 向量,我必须通过多次复制它们来创建矩阵 A,每次将 2 个位置的向量向右移动。我想用零填充左侧的条目。有没有聪明的方法来做到这一点?目前,我正在使用 for 循环和 circshift,并且在每次迭代中添加新行到 A,但这可能效率非常低。
代码(myMat是我要移位的矩阵):
A = [];
myMat = [1 0 -1 zeros(1,246); 0 2 0 -2 zeros(1,245)];
N = 20;
for i=1:N-1
aux = circshift(myMat,[0,2*(i-1)]);
aux(:,1:2*(i-1)) = 0;
A =[A; aux];
end
【问题讨论】:
-
@cholo14 感谢收听 cmets 并编辑您的问题,这个问题现在已经形成并且确实可以回答......不幸的是,我没有戴上线性代数的帽子来计算矩阵运算我认为它必须存在并且会简单地给你这个结果。但是,您至少可以通过使用
zeros(或类似方法)预先分配A的大小来改进代码,然后将aux分配给A的特定行,而不是附加每个循环。 -
按照 Wolfie 的建议进行预定位会产生很大的不同。另外,循环内的第二行用零替换零?如果没有,你会得到同样的结果吗?
-
@CrisLuengo 预分配确实是加快代码速度的一种选择。循环内的第二行用零替换零,但一般
myMat在最后一列中可能有不同于 0 的元素,所以我需要将它们强制为 0 -
@cholo14 所以你实际上并不是在做一个循环移位,而是一个零填充的右移。只复制矩阵的相关位可能更有效。
标签: matlab vector shift replicate