5

在 MATLAB 中索引矩阵时,我可以只指定第一个或最后n 个维度,并让所有其他维度“自动选择”吗?

例如,我正在编写一个接收图像的函数,并用 显示它imshow,它可以显示 3-D 彩色图像(例如 1024×768×3)或 2-D 单色阵列(例如1024x768)。
我的函数不关心图像有多少颜色通道,imshow会处理这个问题。我要做的就是传递参数来选择一个区域:

imshow(frame(x1:x2, y1:y2, :))

我用什么代替最后一个冒号来表示“包括所有其他维度”?

4

2 回答 2

7

You can use comma-separated-list expansion together with the ':' indexing.

Suppose your input is:

A = rand([7,4,2,3]);

To retrieve only first 2:

cln = {':', ':'};
A(cln{:})

To retrieve the last 3:

cln = {1, ':', ':', ':'};
A(cln{:})

Which can be generalized with:

sten            = 2:3;    % Which dims to retrieve
cln(1:ndims(A)) = {1};
cln(sten)       = {':'};
A(cln{:})
于 2013-06-04T18:02:57.767 回答
1

根据 Oleg 的回答,如果您从多个第一个维度中进行选择,这里有一个功能将起作用。如果需要其他尺寸,我想你可以看看如何修改。

function [dat] = getblock2(dat, varargin)
%[dat] = getblock(dat, varargin) select subarray and retain all others
%                                unchanged
%dat2 = getblock(dat, [1,2], [3,5]) is equivalent to
%       dat2 = dat(1:2, 3:5, :, :, :) etc.
%Peter Burns 4 June 2013

arg1(1:ndims(dat)) = {':,'};
v = cell2mat(varargin);
nv = length(v)/2;
v = reshape(v,2,nv)';
for ii=1:nv
    arg1{ii} = [num2str(v(ii,1)),':',num2str(v(ii,2)),','];
end
arg2 = cell2mat(arg1);
arg2 = ['dat(',arg2(1:end-1),')'];
dat = eval(arg2);
于 2013-06-04T20:34:23.360 回答