Как принять участие в матрице, если неизвестен номер измерения в Matlab?
Предположим, я хочу сделать что-то похожее на
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 ответа
Если вы всегда хотите взять все 3-е затемнение, вы можете использовать
>> image(1:end-1,2:end,:,:,:)
даже для 2D массива.
Кроме того, вы можете использовать subsref
для менее специального / хакерского подхода:
>> [S.subs{1:ndims(image)}] = deal(':');
>> S.subs{1} = '1:end-1';
>> S.subs{2} = '2:end';
>> S.type = '()';
>> subsref(image, S )
Предположим, у вас есть массив A
:
A = rand(2,3,2,5,7);
Затем вы можете заполнить с ':'
, остальные размеры вашего выбора:
nd = ndims(A);
subs = repmat({':'},1,nd-2);
A(1:end-1,2:end, subs{:})
У меня было бы две идеи для этого случая.
1-й способ: вы можете изменить свое изображение раньше, например
% 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);
2-й способ: может быть решение использовать eval
а также repmat
например,
eval(['image(1:end-1,2:end',repmat(',:',[1,length(size(image))-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)