【问题标题】:Octave function to get groups of consecutive columns in matrixOctave函数获取矩阵中的连续列组
【发布时间】:2019-10-22 11:03:27
【问题描述】:

我正在尝试找到一种有效的方法来提取矩阵中的 n 个连续列组。示例:

A = [0, 1, 2, 3, 4; 0, 1, 2, 3, 4; 0, 1, 2, 3, 4]; 
n = 3;

应该产生类似这样的输出:

answer = cat(3, ...
                [0, 1, 2; 0, 1, 2; 0, 1, 2], ...
                [1, 2, 3; 1, 2, 3; 1, 2, 3], ...
                [2, 3, 4; 2, 3, 4; 2, 3, 4]);

我知道这可以使用for 循环,例如下面的代码sn-p:

answer = zeros([3, 3, 3]);
for i=1:3
  answer(:, :, i) = A(:, i:i+2);
endfor

但是,在这种情况下,我试图避免使用 for 循环 - 是否也有可能将此操作向量化(使用索引表达式)?

【问题讨论】:

  • 使用blockproc 你可以这样做:answer = reshape(blockproc(A,[n,1],[0,1],@(x) x),n,n,[])(:,:,2:end-1)

标签: matlab matrix vector vectorization octave


【解决方案1】:

仅使用索引

ind = reshape(1:size(A,1)*n, [], n) + reshape((0:size(A,2)-n)*size(A,1), 1, 1, []); 
result = A(ind);

索引ind 是使用linear indexingimplicit expansion 构建的。

使用图像包/图像处理工具箱

result = reshape(im2col(A, [size(A,1) n], 'sliding'), size(A,1), n, []);

这里的大部分工作都是由带有'sliding' 选项的im2col 函数完成的。

【讨论】:

  • 这有预期的结果,我也将测试第二个选项。
猜你喜欢
  • 2018-05-16
  • 2016-11-04
  • 2021-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
相关资源
最近更新 更多