Matlab 使用冒号在未知维度的矩阵中建立索引

Matlab 使用冒号在未知维度的矩阵中建立索引,matlab,multidimensional-array,matrix-indexing,Matlab,Multidimensional Array,Matrix Indexing,在MATLAB中为矩阵编制索引时,我是否可以只指定前n个维度或最后n个维度,并“自动”选择所有其他维度 例如,我正在编写一个函数,它接收图像,并使用imshow显示它,该函数可以显示三维彩色图像(例如1024×768×3)或二维单色阵列(例如1024x768)。 我的函数不关心图像有多少颜色通道,imshow将处理该问题。我要做的就是传递参数以选择单个区域: imshow(frame(x1:x2, y1:y2, :)) 我应该用什么来代替最后一个冒号来表示“包括所有其他维度”您可以使用逗号分隔

在MATLAB中为矩阵编制索引时,我是否可以只指定前n个维度或最后n个维度,并“自动”选择所有其他维度

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

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

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

您可以使用逗号分隔的列表扩展和
:'
索引

假设您的输入是:

A = rand([7,4,2,3]);
要仅检索前2个,请执行以下操作:

cln = {':', ':'};
A(cln{:})
要检索最后3个文件,请执行以下操作:

cln = {1, ':', ':', ':'};
A(cln{:})
可概括为:

sten            = 2:3;    % Which dims to retrieve
cln(1:ndims(A)) = {1};
cln(sten)       = {':'};
A(cln{:})

根据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);

最后一个冒号不起作用吗?通常这就是“all”的Matlab语法@Schorsch是正确的:否,因为这将使其余维度的索引线性化。例如,如果框架是5维的,这将给出一维结果,而不是预期的三维结果。我假设@sebf希望在其现有结构中保留尾随维度?相关问题:非常有用的技巧。值得指出的是,可以有任意多的冒号,因为对于任何“不存在”的尾随维度,长度都假定为1。