我有一个矩阵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(:)))