2014-01-20 3 views
1

Я пытаюсь найти Экстремум 3-мерной матрицы вдоль второго измерения.Найти экстремум многомерной матрицы в matlab

Я начал с [~,index] = max(abs(mat),[],2), но я не знаю, как продвигаться отсюда. Как использовать индексный вектор вместе с исходной матрицей. Или существует совершенно другое решение этой проблемы?

Для иллюстрации задачи рассмотрим следующую матрицу:

mat(:,:,1) = 
    23  8 -4 
    -1 -26 46 
mat(:,:,2) = 
    5 -27 12 
    2 -1 18 
mat(:,:,3) = 
    -10 49 39 
    -13 -46 41 
mat(:,:,4) = 
    30 -24 18 
    -40 -16 -36 

Ожидаемый результат затем будет

ext(:,:,1) = 
    23 
    -46 
ext(:,:,2) = 
    -27 
    18 
ext(:,:,3) = 
    49 
    -46 
ext(:,:,4) = 
    30 
    -40 

Я не знаю, как использовать index вектор с mat, чтобы получить желаемое результат ext.

+0

Я не могу понять, каков ваш вопрос в точности. Вы хотите найти максимум в максимальном размере и после этого что? – Darkmoor

+0

Я хочу найти Максимум абсолютных значений вдоль второго измерения, умноженного на знак. – user1618022

ответ

2

Использование ndgrid для генерации значений вдоль размеров 1 и 3, а затем sub2ind объединить три индекса в linear index:

[~, jj] = max(abs(mat),[],2); %// jj: returned by max 
[ii, ~, kk] = ndgrid(1:size(mat,1),1,1:size(mat,3)); %// ii, kk: all combinations 
result = mat(sub2ind(size(mat), ii, jj, kk)); 

любитель, одна линия альтернатива:

result = max(complex(mat),[],2); 

Это работает, потому что, согласно max documentation,

Для комплексного ввода A max возвращает комплексное число с наибольшим сложным модулем (величиной), вычисленным с max (abs (A)).

3

1) Если вы хотите найти максимум, скажем, размерность 2d, ваша переменная index будет матрицей, имеющей размеры (N, 1, M), где N и M - количество элементов вашей матрицы в первом и третьем измерениях соответственно. Для того, чтобы удалить фиктивные размеры, есть функция отжимает() существует: index=squeeze(index) После этого size(index) дает N,M

2) В зависимости от вашей проблемы, вы, вероятно, нужен MatLab функции ind2sub(). Во-первых, вы берете фрагмент своей матрицы, чем находите ее максимум с линейной индексацией, и можете восстановить свои индексы с помощью int2sub(). Вот пример для 2D-матрицы:

M = randn(5,5); 
[C,I] = max(M(:)); 
[index1,index2] = ind2sub(size(M),I); 

Такой же метод позволяет найти абсолютный максимальный элемент в целом 3D матрицы.

+0

Я не уверен, отвечает ли это на мой вопрос. Правильное решение даст 2-мерный массив, тогда как обработка матрицы как 1-dim, как в вашем коде, возвращает только скаляр (или индекс к нему). – user1618022

+0

Я добавил еще ... Надеюсь, что это полезно – freude

+0

Я знаю о функции сжатия. Поэтому после сжатия это матрица NxM. Что мне делать с этим? – user1618022

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