3

我目前有一个高度 x 宽度 x RGB x imageNumber 形式的 4D 图像矩阵,我想在不使用 for 循环的情况下使用 2D 数组进行索引。二维数组的格式为高 x 宽,值是要索引的图像编号。

我已经让它与 A 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 是图像的高度和宽度尺寸。

谢谢!

4

1 回答 1

4

这使用隐式扩展来构建产生所需结果的线性索引:

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
于 2019-08-25T23:38:31.063 回答