【问题标题】:Using a colon for indexing in matrices of unknown dimensions使用冒号索引未知维度的矩阵
【发布时间】:2013-05-31 05:30:00
【问题描述】:

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

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

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

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

【问题讨论】:

  • 最后一个冒号不起作用吗?通常这是'all'的Matlab语法
  • @Schorsch 是对的:Colon operator documentation
  • 否,因为这将使剩余维度上的索引线性化。例如。如果 frame 是 5 维的,这将给出 1 维结果,而不是预期的 3 维结果。我假设@sebf 想要在其现有结构中保留尾随维度?

标签: matlab multidimensional-array matrix-indexing


【解决方案1】:

您可以将逗号分隔列表扩展':' 索引结合使用。

假设您的输入是:

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{:})

【讨论】:

  • 非常有用的技巧。值得指出的是,您可以使用任意数量的冒号,因为对于“不存在”的任何尾随维度,长度假定为 1。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2012-04-26
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    相关资源
    最近更新 更多