Return the indices of max value in a possible 4D array

I'm trying to get the indices of a max value from a 4 dimension array, that can actually reduce in dimension, so I can display this value and some the value of some other variables at one or more of the same indices. I used something like this:
MAX = find(sx == max(sx(:)));
if MAX/(kk*qq*zz) > 1
rmax = floor(MAX/(kk*qq*zz)) + 1;
MAX = MAX - (kk*qq*zz) * (rmax - 1);
else
if length(theta) == 1
rmax = 0;
rmax = 1;
end
if MAX/(kk*qq) > 1
zmax = floor(MAX/(kk*qq)) + 1;
MAX = MAX - (kk*qq) * (zmax - 1);
else
zmax = 1;
end
if MAX/kk > 1
qmax = floor(MAX/kk) + 1;
MAX = MAX - (kk) * (qmax - 1);
else
qmax = 1;
end
kmax = MAX;
smax = sx(kmax, qmax, zmax, rmax);
but if the array size changes it still wants to output smax as a 4 dimensional array except its not so I get an error.
Is there any function in Matlab for getting these indices?

 채택된 답변

Andrew Newell
Andrew Newell 2015년 2월 20일
편집: Andrew Newell 2015년 2월 20일
If you don't know in advance the size of the array, you can create a cell array for the indices with as many elements as there are dimensions:
[MAX,I] = max(sx(:));
dims = size(sx);
smax = cell(size(dims));
[smax{:}] = ind2sub(dims,I);

댓글 수: 3

Stephen23
Stephen23 2015년 2월 20일
편집: Stephen23 2015년 2월 20일
As an alternative to preallocating a cell array to collect the outputs into, you can rewrite ind2sub or use one of the versions on MATLAB File Exchange that have already done this:
Which lets you use
subs = ind2subvect(size(sx),I);
That would be more transparent. My code is rather cryptic.
Thank you so much. Ind2sub worked on its own. It's a varargout function and it has an if statement for putting ones in empty dimensions. Since I know the max dimension I'll have, it worked. Thanks again.

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

도움말 센터File Exchange에서 Logical에 대해 자세히 알아보기

질문:

2015년 2월 20일

댓글:

2015년 2월 20일

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by