大于 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

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

您遇到了精度问题,可以通过添加一点公差来避免。通过该更改,您可以对此进行矢量化解决方案 -

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(:)))

最新更新