MATLAB: Find the elements of a ND matrix given the index of the elements

matrix manipulation

[b,idx]=min(a,[],2) — gives the value as well as the index of the min value of each row of matrix a.
Now the ques is – how to get b if i've 'a' & 'idx'.
For 2D,i can use a for loop to do it.
But how to do it for ND scenarios?
For example,
a=[0.8147 0.9134 0.2785
0.9058 0.6324 0.5469
0.1270 0.0975 0.9575]
b=[0.2785
0.5469
0.0975]
idx=[3
3
2]
for i=1:length(idx)
b(i)=a(i,idx(i));
end
— it'll do for 2D.

Best Answer

  • Surprisingly there is no trivial way to do this, but one general solution is to generate linear indices, e.g.:
    % input data (any ND array and the corresponding output index from MIN or MAX):
    a = [0.8147,0.9134,0.2785;0.9058,0.6324,0.5469;0.1270,0.0975,0.9575]; % ND array.
    idx = [3;3;2] % indices, must be the same orientation as returned by MIN or MAX.
    % sizes of input data:
    idx = double(idx);
    sza = size(a);
    szn = size(idx);
    szn(end+1:numel(sza)) = 1;
    idd = szn~=sza;
    % linear indices:
    tmp = arrayfun(@(n)1:n,szn,'uni',0);
    [tmp{:}] = ndgrid(tmp{:});
    tmp{idd} = idx;
    ndx = sub2ind(sza,tmp{:});
    You can use the linear indices very simply:
    >> a(ndx)
    ans =
    0.2785
    0.5469
    0.0975