Индексация N-мерного массива в Matlab: найти массив посередине - PullRequest
1 голос
/ 15 января 2020

Я работаю с N-мерным массивом и у меня проблема с индексацией массива. У меня есть задача найти (N-1) -мерный массив в среднем N-мерном массиве.

Позвольте мне подробно объяснить с помощью трехмерного массива. A - это трехмерный массив, который разделен на группы. В каждой группе b - количество 2-мерных массивов в группе. Я смоделировал это как:

b=5;
A=rand(2,2,20);
groups = reshape(A, size(A,1), size(A,2),b, []);

groups - это 4-мерный массив, 4-е измерение - это число групп (здесь оно 4).

Найти середину в каждой группе я добавил следующее l oop:

for ii=1:size(groups,4)  % Loop over all groups/slices
     middle(:,:,ii) = groups(:,:,(w-1)/2+1,ii);  % 1 2 3 4 5 : the middle is 3
end

middle - это трехмерный массив, который собирает средний массив в каждой группе.

Как вы видите в моем примере Я использовал b=5 (нечетное число). Моя проблема с четным числом b.

Я пытался реализовать его как (переписать l oop выше);

l=rem(w,2);
 for ii=1:size(groups,4)  % Loop over all groups/slices
     if l==1
         middle(:,:,ii) = groups(:,:,(w-1)/2+1,ii);  
     else
         middle(:,:,ii) = groups(:,:,(w-1)/2,ii);  
     end
 end

Но это не работает. Matlab выдает мне ошибку в строке l=rem(w,2); Не могли бы вы подсказать мне, как я могу это исправить? Есть ли другой способ реализовать это?

1 Ответ

1 голос
/ 15 января 2020

Вы должны использовать floor из ceil, чтобы округлить индекс до любого элемента, который вы хотите:

middle_index = floor((w-1)/2+1);

Здесь середина 4 равна 2, с помощью ceil вы выбрали бы индекс 3.

Далее вы можете извлечь массивы в одной операции индексации:

middle = groups(:,:,middle_index,:);

Наконец, используйте squeeze или reshape, чтобы избавиться от 3-го индекса:

middle = squeeze(middle);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...