从没有循环的3D矩阵过滤元素

时间:2015-10-22 15:15:17

标签: matlab matrix vectorization

我有一个尺寸为H(i,j,k)的三维矩阵(i=1:m,j=1:n,k=1:o)。我将使用m=n=o = 2的简单案例:

H(:,:,1) =[1 2; 3 4];
H(:,:,2) =[5 6; 7 8];

我希望过滤此矩阵并将其投影到(m,n)矩阵,为每个j in 1:n选择不同的k in 1:0

例如,我想检索(j,k) = {(1,2), (2,1)},产生矩阵G:

G = [5 2; 7 4];

这可以通过for循环来实现:

filter = [2 1]; % meaning filter (j,k) = {(1,2), (2,1)}

for i = 1:length(filter)
    G(:,i) = squeeze(H(:,i,filter(i)));
end

但我想知道是否可以通过一些智能索引来避免for循环。

1 个答案:

答案 0 :(得分:3)

您可以创建所有线性索引以获得具有bsxfun的第一维所需扩展的输出。实现看起来像这样 -

szH = size(H)
offset = (filter-1)*szH(1)*szH(2) + (0:numel(filter)-1)*szH(1)
out = H(bsxfun(@plus,[1:szH(1)].',offset))

如何运作

  • (filter-1)*szH(1)*szH(2)(0:numel(filter)-1)*szH(1)获取线性索引,分别仅考虑第三维和第二维元素。添加这两个给出了偏移线性指数。

  • 使用1:szH(1)以元素方式将第一个维度线性索引offset添加到bsxfun数组,以便为​​我们提供实际的线性索引,当索引到H时将是输出。

示例运行 -

H(:,:,1) =
     1     2
     3     4
H(:,:,2) =
     5     6
     7     8
filter =
     2     1
out =
     5     2
     7     4