Matlab 比较中的错误?

A bug in Matlab comparison?

我在 Matlab 中编写了自己的版本 ismember(find_element) 通过比较 [=15] 来检查矩阵 b 中的行数组 a 是否存在=] 与 b 中的每一行。如果a中的每个元素'equals'中的每个元素b中的一行(如果绝对误差小于Tol),则return逻辑值1和行号。

但是,当我测试我的代码时,我发现当比较 a=1.0e-11*[0.9063 0.0838]B=[-1 0] 时,Matlab 会 return t=[1 1]B 是第二个b 行)。实际上它给出了正确的绝对误差 error=[1.0000 0.0000],显然 error(1) 大于 Tol=1e-6。我在 Matlab 中发现了错误吗?或者我的代码有什么错误吗?

以下是我的find_element代码:

function [Lia,Locb] = find_element(a,b)
%decide whether a is in b or not(compare each row); if in, return row number
%INPUT:
%a: salar or row array
%b: column array or matrix 
%OUTPUT:
%Lia: 1 if a is in b, 0 if not
%Locb: location of a in b, row number if b is a matrix
Tol = 1e-6; %set tolerance when compare elements
Lia = 0;%initialization
Locb = 0;

t = zeros(size(a));%compare result of each element,logical array
for i = 1:size(b,1) %loop through each row
    for j = 1:size(b,2) %compare each element in each row
        if abs(a(j)-b(i,j))<Tol
            t(j) = 1;
        end
    end
    if t %all 1's
        Lia = 1;%find a in b
        Locb = i;%return row number
        %%%%%%%%%%%%%%%%%%%%%%%%
        %test outputs
        a
        B=b(i,:)
        error = abs(a-b(i,:))
        t
        %%%%%%%%%%%%%%%%%%%%%%%%
        break
    end
end

测试代码为:

a = [9.06319429228031e-12   8.37879678833309e-13];
b = [0 1;-1 0;1 0;0 1];
[Lia Locb] = find_element(a,b)

输出是:

a =
   1.0e-11 *
    0.9063    0.0838
B =
    -1     0
error =
    1.0000    0.0000
t =
     1     1
Lia =
     1
Locb =
     2

# 转换为 % 后,我发现您的代码在 Matlab 中适用于以下示例。如果您的问题出现在 Octave 中,请提供清晰可重现的答案或编辑您的问题。

>> a=1.0e-11*[0.9063 0.0838];
>> b=[-1 0];
>> [Lia, Locb] = find_element(a,b)

Lia =

     0


Locb =

     0

>> [Lia, Locb] = find_element([-1.000001 0],b)

a =

           -1            0


B =

    -1     0


error =

        1e-06            0


t =

     1     1


Lia =

     1


Locb =

     1

我现在在我的代码中发现了问题:t 需要在检查每一行之前进行初始化。通过将 t = zeros(size(a)) 放入 i 循环中,它现在可以工作了。

...
for i = 1:size(b,1) %loop through each row
    t = zeros(size(a));%compare result of each element,logical array
    for j = 1:size(b,2) %compare each element in each row
....

测试并输出:

>> a = [9.06319429228031e-12    8.37879678833309e-13];
>> b = [0 1;-1 0;1 0;0 1];
>> [Lia Locb] = find_element(a,b)

Lia =

     0


Locb =

     0