【发布时间】:2013-06-20 07:13:29
【问题描述】:
假设我想做类似的事情
image(1:end-1,2:end,:)
这里是彩色图像的一部分
但维度数未知,即会像这样自动工作
image(1:end-1,2:end)
二维
image(1:end-1,2:end,:)
对于 3 和
image(1:end-1,2:end,:,:)
对于 4 等等。
【问题讨论】:
假设我想做类似的事情
image(1:end-1,2:end,:)
这里是彩色图像的一部分
但维度数未知,即会像这样自动工作
image(1:end-1,2:end)
二维
image(1:end-1,2:end,:)
对于 3 和
image(1:end-1,2:end,:,:)
对于 4 等等。
【问题讨论】:
如果你总是想把所有的 3rd 暗淡和向上,你可以使用
>> image(1:end-1,2:end,:,:,:)
即使是二维数组。
或者,您可以使用subsref 来减少临时/hacky 方法:
>> [S.subs{1:ndims(image)}] = deal(':');
>> S.subs{1} = '1:end-1';
>> S.subs{2} = '2:end';
>> S.type = '()';
>> subsref(image, S )
【讨论】:
bsxfun! 的 MATLAB 问题提供了解决方案? :)
bsxfun(矢量化循环) - 所以我的每个解决方案都有bsxfun(甚至是押韵;)
对于这个案例,我有两个想法。
第一种方式: 您之前可以重塑您的图像,例如
% 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);
第二种方式:
可能是使用eval 和repmat 的解决方案,例如
eval(['image(1:end-1,2:end',repmat(',:',[1,length(size(image))-2]) ')'])
取决于您使用它的目的(设置、获取...)。
【讨论】:
eval() 将是一场噩梦。
eval() 的解决方案投了反对票(我会在以后更新我的描述,说明原因)。
eval 的论据,但我给出了 2 个或多或少有用的答案,你当然不必赞成,但警告评论反对第二个方式已经绰绰有余了。
我有一点想法。您可以制定一个函数,使用size(size(Matrix),2) 分析矩阵的维度。然后你可以构造一个字符串,其中包含你想要的命令和一个小的 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)
【讨论】:
假设你有一个数组A:
A = rand(2,3,2,5,7);
然后,您可以填写':',您选择的剩余维度:
nd = ndims(A);
subs = repmat({':'},1,nd-2);
A(1:end-1,2:end, subs{:})
【讨论】: