Matlab 使用冒号在未知维度的矩阵中建立索引
在MATLAB中为矩阵编制索引时,我是否可以只指定前n个维度或最后n个维度,并“自动”选择所有其他维度 例如,我正在编写一个函数,它接收图像,并使用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, :)) 我应该用什么来代替最后一个冒号来表示“包括所有其他维度”您可以使用逗号分隔
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。