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
我在 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