检测矩阵中的非均匀方向

时间:2013-10-30 07:18:10

标签: matlab matrix

背景

给出这样的矩阵:

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)。

2 个答案:

答案 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;
相关问题