在矩阵中查找浮点值

时间:2014-07-10 11:48:12

标签: matlab floating-point

当我在MATLAB中的矩阵中搜索浮点(十进制)数时,即使它应该在那里也找不到它。具体来说,我需要在矩阵yy = 0.9600X中找到一个数字,比如Y,但MATLAB找不到它们。如何解决这个问题?

A = reshape(1:10000,100,100).'; %'
p = size(A,1);
B = zeros(p,p);
[X,Y] = meshgrid(0:p-1,0:p-1); X = X ./ p; Y = Y ./ p;
X = round(X*10000) / 10000;
Y = round(Y*10000) / 10000;
Y = flipud(Y);
for i=1:p,
    for j=1:p,
        x = X(j,i);
        y = Y(j,i);  
        xx = mod((x+y),1);
        yy = mod((x+2*y),1);
        [r, c] = find(X==xx);     %// NOT FOUND
        [rr, cc] = find(Y==yy);   %// "
        a = A(j,i);
        B(rr(1),c(1)) = a;
    end
end

3 个答案:

答案 0 :(得分:3)

当我想知道某个数字是否在矩阵中时,我通常使用ismemberf File Exchange Submission

这基本上允许您检查具有一定容差的值,这是必需的,因为浮点数可能很棘手,而0.9600实际上可能是0.960000000001。

%Standard functions
I = find(0.3 == [0:0.1:1]) % Returns an empty matrix
[tf, loc]=ismember(0.3, 0:0.1:1) % returns false 

%Function with a small default tolerance
[tf, loc]=ismemberf(0.3, 0:0.1:1) % returns true

基本上就是这样,但我会添加一个如何获取位置来解决你的评论的例子。假设你有一个矩阵M,你想在这个矩阵中找到值7:

% The matrix
M=magic(5)
%Using ismemberf
[tf, loc] = ismemberf(7, magic(5))

%Finding where the value is located:
[I, J] = sub2ind(size(M),loc)

实际上你也可以在这里使用find。您不必担心舍入问题,因为您使用相同的值两次。然后最后一行看起来像这样:

[I,J] = find(M(loc)==M)

请注意,我希望sub2ind表现得更好,因为它是一个更简单的功能。

答案 1 :(得分:1)

您不应对双精度浮点数进行相等测试,有关详细信息,请参阅http://matlab.wikia.com/wiki/FAQ#Why_is_0.3_-0.2-0.1.28or_similar.29_not_equal_to_zero.3F

答案 2 :(得分:1)

MATLAB R2015a 添加了解决此问题的函数ismembertol。来自文档:

  

LIA = ismembertol(A,B,tol)返回一个包含逻辑1(true)的数组,其中A的元素在B中的元素的容差内。否则,数组包含逻辑0(false)。如果

,则uv这两个值在容差范围内
abs(u-v) <= tol*max(abs([A(:);B(:)]))
     

也就是说,ismembertol根据数据的大小缩放tol输入。

请注意,behaves similarly还有一个新的uniquetol函数。