如何在Matlab中获取未知维数的矩阵?

时间:2013-06-23 19:11:30

标签: matlab matrix submatrix

假设我想做类似于

的事情
image(1:end-1,2:end,:)

这里是彩色图像的一部分

但维度数量未知,即自动生成

image(1:end-1,2:end)

表示2维

image(1:end-1,2:end,:)

表示3和

image(1:end-1,2:end,:,:)

代表4等等。

4 个答案:

答案 0 :(得分:2)

如果你总是想要拍摄所有第三个暗淡的,你可以使用

>> image(1:end-1,2:end,:,:,:)

即使是2D阵列。

或者,您可以使用subsref来减少ad-hoc / hacky方法:

>> [S.subs{1:ndims(image)}] = deal(':');
>> S.subs{1} = '1:end-1';
>> S.subs{2} = '2:end';
>> S.type = '()';
>> subsref(image, S )

答案 1 :(得分:0)

对于这种情况我会有两个想法。

第一种方式: 您可以在重新塑造图像之前,例如

% transform image to 3d format
% do not forget to transform all used entities to this 3d-format as well
sizeIm = size(image);
image3 = reshape(image,[sizeIm(1:2),prod(sizeIm(3:end)])

% work on image3
image3(1:end-1,2:end,:) = ...;

% transform back:
image = reshape(image3,sizeIm);

第二路: 可以是使用evalrepmat的解决方案,例如

eval(['image(1:end-1,2:end',repmat(',:',[1,length(size(image))-2]) ')'])

取决于你正在使用它(设置,获取......)。

答案 2 :(得分:0)

假设您有一个数组A

A  = rand(2,3,2,5,7);

然后,您可以填写':',您选择的其余尺寸:

nd   = ndims(A);
subs = repmat({':'},1,nd-2);
A(1:end-1,2:end, subs{:})

答案 3 :(得分:-1)

我有一点想法。您可以制定一个函数,使用size(size(Matrix),2)分析Matrix的维度。然后你就可以用一个for循环来构造一个包含所需命令的字符串,然后用eval执行这个字符串。

A=rand(3,3,3,3,3,3,3,3,3,3) %<--- change here dimension

dim=size(size(A),2)

addstr='';
if dim>2
    for i=1:dim-2
        addstr=[addstr ',:'];
    end
end

command=['A(1:2,1:2' addstr ')']

eval(command)