大于MATLAB中的功能不能按预期工作

时间:2014-04-01 05:23:40

标签: matlab

我有一个矩阵B {1} = [1.1 1.1 1.0; 0.8 0.9 1.2; 0.9 0.9 1.5] 我发现矩阵的整体中位数是1.0。

接下来,我想浏览矩阵中的每个元素,并将其与中位数进行比较。如果元素超过错误阈值0.1,则元素将替换为零。如果元素等于或小于0.1,则元素值将保留。

在完成下面的编码后,我期待B {1}的最终结果 [1.1 1.1 1.0; 0.0 0.9 0.0; 0.9 0.9 0.0]。

然而,下面编码的输出给出B {1} = [0.0 0.0 1.0; 0.0 0.9 0.0; 0.9 0.9 0.0]

for x=1:9
matrix=B{1};
excess = abs(minus(matrix(x),1.0)) 
if excess > 0.1
matrix(x)=0;
B{1}=matrix;
end 
end

知道编码中的错误在哪里?

1 个答案:

答案 0 :(得分:1)

您遇到了精确问题,可以通过在其中添加一点容差来避免。有了这个改变,你可以有一个矢量化解决方案 -

B{1} =[1.1 1.1 1.0 ; 0.8 0.9 1.2 ; 0.9 0.9 1.5] 
matrix=B{1};
TOL = 0.001;%%// Tolerance to account for precision issue
matrix(abs(bsxfun(@minus,matrix,median(matrix(:))))>0.1+TOL)=0;
B{1} = matrix;

在你的代码中,你可以用这个做同样的事情 -

TOL = 0.001;%%// Tolerance to account for precision issue
excess = abs(minus(matrix(x),1.0+TOL)) 

编辑1:您可以使用此功能添加矩阵相关的容差(感谢@bdecaf) -

TOL = max(eps(matrix(:)))