【问题标题】:Detect non-uniform direction in a Matrix检测矩阵中的非均匀方向
【发布时间】:2013-10-30 17:36:42
【问题描述】:

背景

给定一个这样的矩阵:

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。

【问题讨论】:

  • [1 2 3 2 4 5] 的正确输出是什么?
  • 应该去掉 2,用 3 和 4 的平均值代替,得到 3.5:[1 2 3 3.5 4 5]
  • 只有一个偏差是行还是列?因为当你在一个方向(例如行)固定一个值时,可能会破坏另一个方向(即列)。
  • 列也是如此,我只是使用了一个行示例,因为它更容易显示。
  • 平均值有问题。假设您的邻居有 1 个在左边,10 个在上面,11 个在右边和下面。平均值为 8.25,低于 10。可以为两个平均值创建类似示例,其中一个方向违反了另一方向的规则。

标签: matlab matrix


【解决方案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)&lt;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);

【讨论】:

    【解决方案2】:

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

    A=[1 2 3 2 4 5];
    Index1=find(diff(A)-abs(diff(A)));
    Index1=Index1=+1
    

    对于二维情况:

    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;
    

    【讨论】:

    • find(diff(v)-abs(diff(v)))find(diff(v)&lt;0)不一样吗?
    猜你喜欢
    • 1970-01-01
    • 2015-08-28
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多