使用 2D 索引矩阵索引 4D 数组
Indexing a 4D array with a 2D matrix of indicies
我目前有一个 4D 图像矩阵,格式为 height x width x RGB x imageNumber,我想在不使用 for 循环的情况下使用 2D 数组进行索引。二维数组格式为高 x 宽,值为要索引的图像编号。
我已经使用了一个 for 循环,但是由于速度的原因,有没有一种方法可以不用循环来完成它?我试过调整矩阵和索引数组的大小,但到目前为止没有成功。
这是我正在使用的 for 循环(尽管在大图像上速度很慢):
for height = 1:h
for width = 1:w
imageIndex = index(height, width);
imageOutput(height, width, :) = matrix4D(height, width, :, imageIndex);
end
end
其中 h 和 w 是图像的高度和宽度尺寸。
谢谢!
这使用 implicit expansion to build a linear index 产生所需的结果:
matrix4D = rand(4,2,3,5); % example matrix
[h, w, c, n] = size(matrix4D); % sizes
index = randi(n,h,w); % example index
ind = reshape(1:h*w,h,w) + reshape((0:c-1)*h*w,1,1,[]) + (index-1)*h*w*c; % linear index
imageOutput = matrix4D(ind); % desired result
对于 R2016b 之前的 Matlab 版本,您需要使用 bsxfun
而不是隐式扩展:
ind = bsxfun(@plus, bsxfun(@plus, ...
reshape(1:h*w,h,w), reshape((0:c-1)*h*w,1,1,[])), (index-1)*h*w*c); % linear index
我目前有一个 4D 图像矩阵,格式为 height x width x RGB x imageNumber,我想在不使用 for 循环的情况下使用 2D 数组进行索引。二维数组格式为高 x 宽,值为要索引的图像编号。
我已经使用了一个 for 循环,但是由于速度的原因,有没有一种方法可以不用循环来完成它?我试过调整矩阵和索引数组的大小,但到目前为止没有成功。
这是我正在使用的 for 循环(尽管在大图像上速度很慢):
for height = 1:h
for width = 1:w
imageIndex = index(height, width);
imageOutput(height, width, :) = matrix4D(height, width, :, imageIndex);
end
end
其中 h 和 w 是图像的高度和宽度尺寸。
谢谢!
这使用 implicit expansion to build a linear index 产生所需的结果:
matrix4D = rand(4,2,3,5); % example matrix
[h, w, c, n] = size(matrix4D); % sizes
index = randi(n,h,w); % example index
ind = reshape(1:h*w,h,w) + reshape((0:c-1)*h*w,1,1,[]) + (index-1)*h*w*c; % linear index
imageOutput = matrix4D(ind); % desired result
对于 R2016b 之前的 Matlab 版本,您需要使用 bsxfun
而不是隐式扩展:
ind = bsxfun(@plus, bsxfun(@plus, ...
reshape(1:h*w,h,w), reshape((0:c-1)*h*w,1,1,[])), (index-1)*h*w*c); % linear index