3

背景

给定这样的矩阵:

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 的平均值)。

编辑2:

忽略插值部分,我稍后会解决。

给定

 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

哪个是误差值和周围的点。从这些点出发,我将使用 3、3、5 和 5(忽略角点 2、4、4 和 6)进行 2D 插值以(希望)用 4 替换 2。

4

2 回答 2

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)

例如,如果您正在查看垂直递减模式,则可以使用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);
于 2013-10-30T09:20:53.463 回答
0

我会用它来查找一维数组的错误值指标:

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;
于 2013-10-30T09:20:45.987 回答