"Find" function with 3d matrix doesn't work
조회 수: 3 (최근 30일)
이전 댓글 표시
Hello, I have a 3d matrix named A3D (size 200x200x200). Values in this matrix are from 0 to 1. If I type for example:
A3D(50,92,100)
I get an answer:
ans =
1.0000
So I'm sure there are values 1 (actually I know it also from "image" of a slice of matrix - there I can see a lot of values "1"). But when I try to use "find":
[val1,val2,val3] = ind2sub(size(A3D),find(A3D == 1));
then vectors val1 val2 and val3 are empty. These vectors are filled when I type:
[val1,val2,val3] = ind2sub(size(A3D),find(A3D < 1));
It that case Matlab says that all of the values in my matrix are <1. But that is not true! Why matlab doesn't want to find values == 1? Thank you very much for your help!
댓글 수: 0
채택된 답변
Titus Edelhofer
2012년 8월 21일
Hi,
the answer
ans =
1.0000
instead of
ans =
1
tells you the problem: the value is 1, but only rounded to 5 digits. It's not exactly one. Change your code to
[val1,val2,val3] = ind2sub(size(A3D),find(abs(A3D-1)<1e-10));
where 1e-10 is the tolerance. Choose the tolerance in such a way that you only catch those entries that are 1 (within the tolerance).
Titus
댓글 수: 4
Matt Fig
2012년 8월 21일
편집: Matt Fig
2012년 8월 21일
If that is all you are doing, why even bother with FIND and IND2SUB?
A3D(abs(A3D-1)<1e-10) = 0;
In fact, what you are trying to do above will not even work. Look at a simpler example so you can see for yourself.
A = rand(3,3,3)
B = A; % A copy, to compare.
[I,J,K] = ind2sub(size(A),find(abs(A-1)<.2)) % Find all on [.8 1];
A(I,J,K) = nan % Does this look right to you?? NO!
B(abs(B-1)<.2) = nan % That looks better!!
추가 답변 (1개)
Azzi Abdelmalek
2012년 8월 21일
use
[val1,val2,val3] = ind2sub(size(A3D),find(A3D <= 1 & A3D>1-eps));
maybe 1 is 0.9999999999999999999 for numeric considerations
댓글 수: 2
참고 항목
카테고리
Help Center 및 File Exchange에서 Matrix Indexing에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!