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 つだけであり、グループ化されることはないと想定しています。[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]3.5は[1 2 3 3.5 4 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 に置き換えるために 2D 補間を行います (コーナー 2、4、4、および 6 は無視します)。

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、たとえば次のように使用できます。正確な差 (常に 1 ですか?) を探している場合は、差が値と等しいかどうかを確認できますが、浮動小数点計算と丸めの問題によって生じる危険性に注意する必要があります。

エラーを埋める

あなたへの私の提案は、最初に、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

これを使用して、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;
于 2013-10-30T09:20:45.987 に答える