Matrix and find

2 Ansichten (letzte 30 Tage)
Salvatore Turino
Salvatore Turino am 15 Jan. 2012
Hello actually i have a random matrix done of a lot of 0 and some 1. i need to save the position (i,j) of the first 1 for each row/column. If i have a matrix like this one
0 1 0 0 0 1 0 0
0 0 1 0 0 0 0 0
0 0 1 0 0 0 0 0
doing a(i)=find(matrix(i,:),1) i got a=[2,3,3], and this is ok.
Instead if i have this matrix:
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0
doing the same thing with the find i got error.
Improper assignment with rectangular empty matrix.
why?
  1 Kommentar
Image Analyst
Image Analyst am 15 Jan. 2012
What do you want or expect to get when you have no 1's in the row? Maybe -1 or something? It's got to be something.

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Jan
Jan am 15 Jan. 2012
You have to decide, what you want as output, if a row does not contain any 1.
n = size(matrix, 1);
a = zeros(1, n); % Pre-allocate!
for i = 1:n
found = find(matrix(i,:), 1);
if isempty(found)
a(i) = NaN; % Or Inf, or -1, or 0, or whatever?!
else
a(i) = found;
end
end
[EDITED]: You can define the default value in the pre-allocation to make the code 2 lines shorter:
n = size(matrix, 1);
a = nan(1, n); % Pre-allocate!
for i = 1:n
found = find(matrix(i,:), 1);
if ~isempty(found)
a(i) = found;
end
end
  1 Kommentar
Salvatore Turino
Salvatore Turino am 16 Jan. 2012
thank you :) this is was i was looking for. yesterday evening i did it in a different way but your code is more compact and functional. thank you

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (2)

the cyclist
the cyclist am 15 Jan. 2012
For the first matrix, when i=1, "find(matrix(1,:),1)" looks at the first row of the matrix, and looks for the first column that has a non-zero in it. That's column 2, so you are doing a(1)=2, which is fine.
For the second matrix, when i=1, the same command returns the empty matrix, because there is no non-zero in the first row. Therefore, you are trying to do a(1)=[], which gives the error you see.
Edit in response to your comment:
Here's a different way from Jan's, in which only the rows that actually have non-zeros are displayed:
x = [0 1 0 0 0 1 0 0 ...
0 0 1 0 0 0 0 0 ...
0 0 1 0 0 0 0 0];
[m,n]=find(x);
[rowsWithNonZero,indexToFindColumn] = unique(m,'first');
columnsOfFirstNonZero = n(indexToFindColumn);
disp('row:')
disp(rowsWithNonZero)
disp('column:')
disp(columnsOfFirstNonZero)

Salvatore Turino
Salvatore Turino am 15 Jan. 2012
ok and a possible solution?i need something that find me all the first 1 of the matrix in both cases

Community Treasure Hunt

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

Start Hunting!

Translated by