# find the position of all non-zero minimum values in each column of a matrix

조회 수: 9(최근 30일)
Giannis Nikolopoulos 2021년 5월 4일
댓글: Walter Roberson 2021년 5월 6일
Hello,
I need your help with the below problem:
I have a matrix something like that:
a = [2 0 3;1 2 5;0 0 0;1 3 3;0 0 6;0 2 7;1 0 0]
and i need to find the position of all minimum (non-zero) values of each column. For example in the first column the position of the three ones, in the second column the position of the two two etc...
I think that it is very easy but I'm stuck

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

### 답변(4개)

Bruno Luong 2021년 5월 5일
편집: Bruno Luong 2021년 5월 5일
a = [2 0 3;1 2 5;0 0 0;1 3 3;0 0 6;0 2 7;1 0 0]
b=a;
b(b==0)=NaN;
[r,c]=find(b==min(b,[],1));
rmin=accumarray(c(:),r(:),[size(a,2),1],@(r){r});
if ~iscell(rmin) % exceptional case where a contains all 0
rmin = cell(size(rmin));
end
celldisp(rmin)
##### 댓글 수: 0표시숨기기 이전 댓글 수: -1

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

Walter Roberson 2021년 5월 4일
a = [2 0 3;1 2 5;0 0 0;1 3 3;0 0 6;0 2 7;1 0 0]
a = 7×3
2 0 3 1 2 5 0 0 0 1 3 3 0 0 6 0 2 7 1 0 0
positions = cellfun(@(A) find(A==min(A)), num2cell(a,1), 'uniform', 0)
positions = 1×3 cell array
{3×1 double} {4×1 double} {2×1 double}
The result has to be a cell array because there are a different number of matches in each column.
##### 댓글 수: 8표시숨기기 이전 댓글 수: 7
Walter Roberson 2021년 5월 6일
a = zeros(3);
positions = cellfun(@(A) find(A==reshape(min(A(A~=0)),1,[])), num2cell(a,1), 'uniform', 0)
positions = 1×3 cell array
{0×1 double} {0×1 double} {0×1 double}
celldisp(positions)
positions{1} = [] positions{2} = [] positions{3} = []

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

Image Analyst 2021년 5월 4일
If you want a lengthier, but less cryptic brute force way of finding the min in each column and the row(s) it occurs at, see this:
a = [2 0 3;1 2 5;0 0 0;1 3 3;0 0 6;0 2 7;1 0 0]
[rows, columns] = size(a)
minOfEachColumn = zeros(columns, 1);
indexesOfEachColumn = cell(columns, 1);
for col = 1 : columns
thisColumn = a(:, col);
% Ignore zeros by setting them to inf.
thisColumn(thisColumn == 0) = inf;
% Get the min value of what's left.
minOfEachColumn(col) = min(thisColumn);
fprintf('For column #%d, the min non-zero value is %f.\n', col, minOfEachColumn(col));
% Get what index(es) that that min occurs at.
indexesOfEachColumn{col} = find(thisColumn == minOfEachColumn(col));
end
minOfEachColumn % Display in command window.
celldisp(indexesOfEachColumn)
##### 댓글 수: 0표시숨기기 이전 댓글 수: -1

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

Giannis Nikolopoulos 2021년 5월 5일
Hello,
Thank you all (@Image Analyst, @Bruno Luong, @Walter Roberson) for your help. All suggestions are good for me with the prefered results.
@Walter Roberson I restarted my matlab and the result were fine then!!
Best,
Giannis
##### 댓글 수: 1표시숨기기 없음
Image Analyst 2021년 5월 5일
That should not have been needed. Worst case, you would have just had to do a "clear all". I think your "a" was not what you thought it was.

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

### Community Treasure Hunt

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

Start Hunting!