大于MATLAB中的函数未按预期工作

大于MATLAB中的函数未按预期工作,matlab,Matlab,我有一个矩阵B{1}=[1.11.11.0;0.80.91.2;0.90.91.5] 我发现矩阵的总体中值为1.0 接下来,我要遍历矩阵中的每个元素,并将其与中值进行比较。如果该元素超过错误阈值0.1,则该元素将替换为零。如果元素等于或小于0.1,则元素值将保持不变 在完成下面的编码之后,我希望我的B{1}的最终结果是 [1.11.11.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.

我有一个矩阵B{1}=[1.11.11.0;0.80.91.2;0.90.91.5] 我发现矩阵的总体中值为1.0

接下来,我要遍历矩阵中的每个元素,并将其与中值进行比较。如果该元素超过错误阈值0.1,则该元素将替换为零。如果元素等于或小于0.1,则元素值将保持不变

在完成下面的编码之后,我希望我的B{1}的最终结果是 [1.11.11.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)-


这是一个精度问题的例子,请看这里的另一个例子和对此的一些解释-另一个,可能更接近您的例子-谢谢@Divakar的建议:)上面的代码仍然产生相同的输出。我将研究其他示例以纠正精度问题。@Amilia我可以就此提出一些建议。为什么不在阈值中加一点公差值,比如说0.001。这样,代码将变成-
矩阵(abs(bsxfun(@减号,矩阵,中位数(矩阵(:)))>0.1+0.001)=0
。如果对你有用,试试看。我认为你可以添加尽可能少的
1e-15
作为公差。是的,它是有效的。输出与我期望的一样,输入公差为阈值。非常感谢@Divakar:)我想补充一下,为了获得一个合理的公差值,
eps
函数可以为您提供最低有效位的大小,当您使用输入调用它时,例如
eps(矩阵(x))
@Divakar没有理由将其设置为10,而不是5或20。我只是选择了上升1个数量级,因为有些人选择了2个数量级,这可能仍然会导致你在实践中遇到问题。另一方面,有些人可能会选择1000,这可能会导致不同类型的问题。这主要是个人喜好的问题。
TOL = max(eps(matrix(:)))