背景
给出这样的矩阵:
X = [1 2 3 4 5;
2 3 4 5 6;
3 4 5 6 7;
4 5 6 7 8]
我们可以看到每个数字都向右和向下增加。然而,只要方向/斜率是均匀的,方向并不重要。
这可以通过以下方式进行测试:
> gradient(X) >= 0;
ans = [1 1 1 1 1;
1 1 1 1 1;
1 1 1 1 1;
1 1 1 1 1]
和
> gradient(X') >= 0 % transpose of X
ans = [1 1 1 1 1;
1 1 1 1 1;
1 1 1 1 1;
1 1 1 1 1]
在这个例子中,我假设数据正在向右/向下增加,扩展到任何统一方向并不是一项复杂的任务。
这可以结合到完整的测试中:
> all(all(gradient(X) > 0)) && all(all(gradient(X') > 0))
ans = 1
问题:
如何检测到这个统一方向的偏差和"修复"它。 修复应该涉及插入周围点的值。
注意:
实际上,这些矩阵非常大,并且包含的值可能只有很小的差异。
我现在假设一次只有一个偏差,他们不会被归为一组:[1 2 3 2 4 5] (2 is an error)
,而不是[1 2 3 2 1 4] ([2 1] is an error)
修改
[1 2 3 2 4 5]
应变为[1 2 3 3.5 4 5]
其中3.5是周围点的插值(在本例中为3和4的平均值)。
EDIT2:
忽略插值部分,我稍后会解决这个问题。
给出
X =
1 2 3 4 5
2 3 2 5 6
3 4 5 6 7
4 5 6 7 8
2显然是"错误"。我希望以下输出:
2 3 4
3 2 5
4 5 6
哪个是错误值和周围的点。从这些点开始,我将进行2D插值,用(希望)4替换2,使用3个,3个,5个和5个(忽略角2,4,4和6)。
答案 0 :(得分:1)
更新后,您似乎可以自己“纠正错误”。这只留下了如何找到它们的问题。但是,我还提出了如何插值并使用它的建议。
查找错误
假设这是你的矩阵:
x = [1 2 3 4 5;
2 3 2 5 6;
3 4 5 6 7;
4 5 6 7 8]
假设你有一个垂直和水平增加的矩阵,下面是如何找到异常:
idx = [zeros(1,size(x,2)); diff(x)<0] | [zeros(size(x,1),1), diff(x,[],2)<0]
如果您想拥有行索引和列索引,可以执行以下操作:
[myRows, myCols] = find(idx)
如果您正在垂直查看decresing模式,可以使用diff(x)<0
。如果您正在寻找一个确切的差异(总是一个?),您可以检查差异是否等于您的值,但您需要了解浮点计算和舍入问题所带来的危险。
填写错误
我的建议是首先确定每个值,backup
值是什么,以防您想要替换它。这可以通过应用过滤器来完成,例如:
altValues = filter2([0 1 0;1 0 1; 0 1 0]/4,x);
现在替换找到的错误可以这样做:
x(idx) = altValues(idx);
这将得到以下结果:
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
如果您想考虑对角线差异,您可能需要使用此过滤器:
altValues = filter2(ones(3)/9,x);
答案 1 :(得分:0)
我会用它来查找1D数组的错误值索引:
A=[1 2 3 2 4 5];
Index1=find(diff(A)-abs(diff(A)));
Index1=Index1=+1
对于2D案例:
A=[1 2 3 2; 1 1 1 1; 2 2 2 2; 1 1 1 1];
[Index1,Index2]=find(diff(A,1,1)-abs(diff(A,1,1)));%wrong gradient along x
Index1=Index1+1;
[Index1a,Index2a]=find(diff(A,1,2)-abs(diff(A,1,2)));%wrong gradient along y
Index2a=Index2a+1;