我有一个尺寸为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
循环。
答案 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