2015-07-23 7 views
3

У меня есть 3D-матрица в Matlab для хранения последовательности 2D-массивов. У меня найти максимальное значение и его индексов строки и столбца, который является довольно простым для одной переменной, которая содержит 2D-массив как вЛучший способ сгладить 2D-матрицу до 1D при нарезке из трехмерной матричной переменной

A = rand(10,10); 
[m,i] = max(A(:)); 
[I,J] = ind2sub(size(A) , i) 

Беда в том, что я не могу использовать этот синтаксис для 3D матрица

A = rand(10,10,3); 
[m,i] = max(A(:,:,1)(:)); 
[I,J] = ind2sub(size(A(:,:,1)), i) 

Error:()-indexing must appear last in an index expression. 

я мог бы создать временную переменную для хранения 2D срез, но я думал, что увижу, если есть лучшее средство сделать это, возможно, сделать вызов, чтобы изменить? Есть ли способ использовать простой оператор линеаризации/сглаживания (:) в этом контексте?

ответ

4

Вот что я хотел бы сделать:

[B i]=max(reshape(A,[],size(A,3))); 
[II,JJ]=ind2sub(size(A),i); 

Единственным ограничением является то, что оно не будет относиться хорошо случаи, когда есть более чем один максимум на 2D срез.

+0

Сладкий использование оба изменяются и ind2sub! Способ использования ind2sub здесь выглядит немного «вне метки» (но не ошибается). Более читаемая версия может быть [II, JJ] = ind2sub (размер (A, 1) (A, 2)], i); –

+0

все это, похоже, я не могу использовать этот оператор сглаживания. Хорошо, что вы можете изменить форму. – jxramos

1

Вы можете преобразовать его в массив ячеек и использовать cellfun

B=mat2cell(reshape(A,[1, size(A,2).^2, size(A,3)]),[1],[size(A,2).^2], [ones(size(A,3),1)]); 
[M,I]= cellfun(@max,B) 
[R,C] = ind2sub(size(A),I); 

M содержит максимальное значение и I соответствующий индекс.


Предполагая, что A является 3x3x2 массив.

A =[ 

    0.7952 0.4456 0.7547 
    0.1869 0.6463 0.2760 
    0.4898 0.7094 0.6797]; 

A(:,:,2) =[ 

    0.6551 0.4984 0.5853 
    0.1626 0.9597 0.2238 
    0.1190 0.3404 0.7513]; 

Преобразовать каждый кусочек в массиве 1x9x2 клеток

B=mat2cell(reshape(A,[1, size(A,2).^2, size(A,3)]),[1],[size(A,2).^2], [ones(size(A,3),1)]); 

B(:,:,1) = 

    [1x9 double] 


B(:,:,2) = 

    [1x9 double] 

Возьмите максимум каждого среза. R - это строка, а C - столбец для соответствующего максимального значения в M.

[M,I]= cellfun(@max,B) 
[R,C] = ind2sub(size(A),I) 

R(:,:,1) = 

    1 

R(:,:,2) = 

    2 

C(:,:,1) = 

    1 

C(:,:,2) = 

    2 
0

Последовательно с макс будет непосредственно вытащить индексы в (обратной) последовательности:

A = rand(10,10,3); 
[m,J] = max(max(A(:,:,1))); 
[m,I] = max(A(:,J,1)); 

% проверка: А (I, J 1) == м

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