Как получить доступ к многомерным массивам в MATLAB со смешанным индексным форматом - PullRequest
4 голосов
/ 20 декабря 2011

Предположим, у меня есть два массива, M1 и M2. Оба имеют размеры m x n x p. Меня интересует массив Mxn M1, соответствующий максимальному элементу в третьем измерении, поэтому я делаю:

      [M1max, indices]=max(M1,[],3);

И M1max, и индексы - это m x n массивов. Но теперь предположим, что я хочу получить доступ к элементам M2, которые соответствуют этим максимальным элементам в M1 (то есть, я хочу, чтобы все элементы M2 с тем же индексом, что и элемент M1, который оказался в M1max). Как мне это сделать?

Ответы [ 3 ]

2 голосов
/ 20 декабря 2011

Я думаю, что это должно сделать это:

[y x]=ndgrid(1:size(M1,1),1:size(M1,2));
reshape(M2(sub2ind(size(M1),y(:),x(:),indices(:))),[size(M1,1),size(M1,2)]);

Вы хотите, чтобы весь индекс был idx <-> (y,x,indices(y,x)), это вычислит его. А затем вычислите M2(idx) и измените его.

1 голос
/ 20 декабря 2011

Другим способом является игнорирование индексов из max:

indices2 = M1 == repmat(M1max,[1,1,size(M1,3)]);
result = reshape(M2(indices2),size(M1max));

. Может быть проблема точности при сравнении двойных чисел.В этом случае вы можете сделать

indices2 = repmat(M1max,[1,1,size(M1,3)]) - M1 < eps;

Кроме того, будет проблема с этим кодом, если в M1 в 3-м измерении существует несколько идентичных максимальных значений.Мы можем поймать этот случай с

assert(sum(indices2(:))==numel(M1max),'Multiple maximum values found')
0 голосов
/ 20 декабря 2011

Это может быть немного быстрее, чем предложение @ Оли, но они в основном эквивалентны:

[M1max, indices] = max(M1,[],3);
[m n p] = size(M1);
idx = (1:m*n).' + (indices(:)-1)*m*n;
M2max = reshape(M2(idx), m, n);
...