2013-06-23 3 views
2

Предположим, что я хочу сделать что-то похожее наКак принять участие в матрице, если неизвестное количество измерений в 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 и так далее.

ответ

2

Если вы хотите всегда принимать все 3 тусклым и, вы можете использовать

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

даже для 2D массива.

В качестве альтернативы, вы можете использовать subsref для менее Времнного/Hacky подхода:

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

Шай предлагает решение проблемы MATLAB это * не * использовать 'bsxfun' !? :) –

+0

@DangKhoa не забывайте, что у меня есть фоновый процесс, который запускает 'bsxfun' в цикле (цикл векторизации) - поэтому каждое мое решение имеет' bsxfun' (и даже это рифмы;) – Shai

0

Я бы две идей для этого случая.

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

второй путь: Может быть решение использовать eval и repmat, например

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

Зависит от того, что вы используете для (установка, получение, ...).

+1

-1 Для eval , Код уже не прост для чтения, а 'eval()' будет кошмаром. – Oleg

+1

Ничего себе ... это «справедливо»! Это всего лишь одно предложение. Вы знаете, где и как именно он хочет его использовать? – matheburg

+0

I down-vote 'eval()' решения в 99% случаев (я буду обновлять в будущем свое описание, почему). – Oleg

-1

У меня есть небольшая идея. Вы можете сформулировать функцию, которая анализирует размер вашей матрицы с помощью size(size(Matrix),2). Затем вы можете построить строку, содержащую требуемую команду с небольшим циклом, и после этого вы выполните эту строку с 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) 
+0

Эй, я опубликовал это 15 минут назад в одной строке. Я полагаю, что Олег скоро вас закроет ;-) – matheburg

+0

-1 Для 'eval()'. – Oleg

+0

@matheburg вы так правы. Потому что я думаю, что это не такая уж плохая идея, я снова проголосую за тебя ;-) –

0

Предположим, у вас есть массив A:

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

Затем вы можете заполнить с ':', остальные размеры вашего выбора:

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

 Смежные вопросы

  • Нет связанных вопросов^_^