Matrix and find

2 次查看(过去 30 天)
Salvatore Turino
Salvatore Turino 2012-1-15
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 个评论
Image Analyst
Image Analyst 2012-1-15
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.

请先登录,再进行评论。

采纳的回答

Jan
Jan 2012-1-15
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 个评论
Salvatore Turino
Salvatore Turino 2012-1-16
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

请先登录,再进行评论。

更多回答(2 个)

the cyclist
the cyclist 2012-1-15
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 2012-1-15
ok and a possible solution?i need something that find me all the first 1 of the matrix in both cases

类别

Help CenterFile Exchange 中查找有关 Logical 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by