通过 Matlab 中的移动索引移动矩阵中的批量行

Posted

技术标签:

【中文标题】通过 Matlab 中的移动索引移动矩阵中的批量行【英文标题】:Shift bulk rows in a matrix by a shifting index in Matlab 【发布时间】:2019-07-21 14:48:23 【问题描述】:

请注意,我使用的是 Matlab R2013b。所以,我有一个 10x2 大小的玩具输入矩阵:

inputM = [NaN 4 7 NaN 9 NaN NaN NaN NaN NaN; NaN NaN 8 10 2 NaN 3 NaN NaN NaN]

我有非NaN值位于每列的最低和最高位置:

lowest_idx = [2 3]
highest_idx = [5 7]

我想根据移动索引shift_idx = [3 2] 在最低和最高位置之间向下移动批量行。我需要获得的输出矩阵看起来像

outputM = [NaN NaN NaN NaN 4 7 NaN 9 NaN NaN; NaN NaN NaN NaN 8 10 2 NaN 3 NaN]

我可以像这样使用for loop 来做到这一点:

for i = 1:length(shift_idx)
    inputM(lowest_idx(i)+shift_idx(i):highest_idx(i)+shift_idx)(i),i) = inputM(lowest_idx(i):highest_idx(i),i);
    inputM(1:lowest_idx(i)+1,i) = nan;
end

但是,我的真实矩阵有超过 100 万列,所以我想要一个更有效的解决方案。任何人都知道如何在没有for loop 的情况下做到这一点?

【问题讨论】:

【参考方案1】:

circshift 正是这样做的。

outputM  = circshift(inputM.', shift_idx).';

【讨论】:

@Sadar Usama 我尝试了您的解决方案,但outputM 中的列被互换了,这是我不想要的。我只想要行移位,而不是列,因为我分别处理行。我设法使用circshift 做到这一点的唯一方法仍然是使用for loop,例如for i = 1:numel(n) outputM(:,i) = circshift(inputM(:,i), shift_idx(i)); end @Bowecho 你的代码给出了这个输出:[NaN 4; NaN NaN] 你确定你想要这个吗?我的代码给出了您在原始问题中编写的输出【参考方案2】:

如果您可以访问 Matlab R2016a,请使用 circshift。例如,

outputM = circshift(inputM, shift_idx);

如果您没有circshift 的现代版本,则需要使用旧版本两次。沿着每个维度一次。例如,

for i = 1:numel(size(shift_idx))
  outputM = circshift(inputM, shift_idx(i),i);
end

警告:以上内容并非旨在完全按照您的要求完成。但是试一试。你会看到它的作用。

在您的特定问题中,由于您对每一行的处理方式不同,因此这种转变对计算的要求会更高。您仍然可以使用circshift。例如,

outputM = [circshift(inputM(:,1), shift_idx(1),2); circshift(inputM(:,1), shift_idx(2),2)];

请务必先阅读文档并先对简单示例进行测试。您还需要了解未填充元素的移动行为。

【讨论】:

以上是关于通过 Matlab 中的移动索引移动矩阵中的批量行的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB中批量处理矩阵

matlab如何使行向量中的元素平方?

如何从 MATLAB 中的矩阵创建子矩阵(全部 5*5)?

请问如何使用MATLAB进行元胞数组批量提取数据。

MATLAB之逻辑

matlab如何批量读取mat文件中的矩阵?