1

私は過去にここSOで助けを求めてある程度の成功を収め、皆さんから多くの良いヒントやヒントを集めてきました。私は本当に助けたい3つの問題に遭遇しました。まず、入力として使用している散布図の写真を次に示します。

散布図

正確なプロットを生成するために使用したコードは次のとおりです(手動の矢印/線を除く)。

ソースコード

誰かが私が持っている3つの質問で私を助けることができるかどうか知りたいです:

  1. 上記の点を考慮して、手動で入力した線をプログラムで描画するにはどうすればよいですか?私はLSアプローチを試しましたが、それはok(ish)の結果を生成し、「よりタイトな」直線が得られるかどうかはわかりません。
  2. 私のデータには、行/列の方法で他のデータと正確に一致しない外れ値が時々あります。そのような外れ値を削除する方法はありますか(プロットのポイントAに見られるように)?
  3. 最後に、ポイントが特定の順序で並べられていない場合に、各「長方形」の「中心」を計算する方法はありますか?これらのポイントを特定の順序で注文して支援することはできますか?それとももっと賢い方法はありますか?

私の質問をご覧いただきありがとうございます。私は誰かがこれを手伝ってくれることを本当に望んでいます-私はこれらのことを行う方法を理解しようとして頭を悩ませてきました、そして私は解決策を思い付くことができません。

編集:水平方向に正しくないため、LSアプローチへのリンクを削除しました。

4

1 に答える 1

0

よし、ここで手を貸すために少しダウンタイムがあった。少なくとも、プログラムで線を引くことから始めることができると思います。うまくいけば、ここにある他の 2 つの質問に取り組むための洞察が得られることを願っています。

私はあなたが持っていたコードをほとんどコピーして、そこから始めました。ここに貼り付けたのは、cx と cy マトリックスを宣言した後に追加/調整したものです。

ここで、私の思考プロセスと論理を説明します。 Cyの「圧縮された」行列になるように設計されていますがcxcyY 座標値に沿って並べ替えられています。 Cx代わりに X 座標に沿ってソートされることを除いて同じです。ロジックなどはかなり単純明快なはずです。そう言うだけでなく、説明します!

diffYdiffX. _ XY ペアが格子状の形状を形成するパターンがここにあることがわかっているので、各座標 (X と Y を別々に) の差を取りました。私は基本的に、ポイントの各行(水平および垂直)のY(またはX)値にかなりの違いがあるという事実に頼っています。隣接点間にこの差があると、2 より大きい差を探します (これは、差が何であったかを確認した後の事後的なものです)。-1 は、次の行の開始ではなく、行の実際の終了を示すために使用されます。これは、リスト内の項目 (1,:) から開始するためです (行を見ればより意味があります)。コードで)。

(もちろん、これは非常に大きな仮定であり、この特定のデータ セットに固有のものです。ただし、ほとんどのグリッドのような形状で一般化できる可能性がありますが、テストする必要があります。)

また、メモ。違いを使って集めたポイントのリストの後半で、私の思考プロセスが崩壊し始めたことに気付きました。コードにあるパターンに従って、さらに多くの行をプロットし続けて、私が何を意味するかを確認できます。

他の2つの質問まで。あなたはおそらく私がここで持っているアイデアを取り入れて、それを改善/拡張することができます. 特定の行 (idx[1] -> idx[2]) のすべてのポイントを見て、それらが線に沿っていることを確認するだけで、外れ値を見つけることができるはずだと私は考えています。基本的に、線を描くために使用される点を使用して取得できる線の方程式の一般式を満たす必要があります。もちろん、そのためには多少のエラー許容度が必要です。

次に、長方形の場合、順序付けられたポイントのグループを使用して長方形を作成し、おそらくregionprops関数を使用して、収集できるデータポイントによって指定された長方形の重心 (2D 世界の中心) を計算できます。

頑張ってください!

Cy = zeros(length(cy),2);
[Cy(:,2), IX] = sort(cy);
Cy(:,1) = cx(IX)';

diffY = [0; diff(Cy(:,2))]
idx = find(diffY>2)-1
Cy(idx,:) % Last mark in given row, appears to be slight issue further along.

Cx = zeros(length(cx),2);
[Cx(:,1), IX] = sort(cx);
Cx(:,2) = cy(IX)';

diffX = [0; diff(Cx(:,1))]
idx2 = find(diffX>2)-1
Cx(idx2,:) % Last mark in given row, appears to be slightly off later on. (top of grid though)



%%
figure('Position',[0,0,c,r]);
scatter(Cy(:,1),Cy(:,2),'.');
axis([0 c 0 r])
set(gca,'YDir','reverse')
% Horizontal lines
line([Cy(1,1) Cy(idx(1),1)], [Cy(1,2) Cy(idx(1),2)], 'Color', 'red', 'LineWidth', 2)
line([Cy(idx(1)+1,1) Cy(idx(2),1)], [Cy(idx(1)+1,2) Cy(idx(2),2)], 'Color', 'red', 'LineWidth', 2)
line([Cy(idx(2)+1,1) Cy(idx(3),1)], [Cy(idx(2)+1,2) Cy(idx(3),2)], 'Color', 'red', 'LineWidth', 2)

% Vertical lines
line([Cx(1,1) Cx(idx2(1),1)], [Cx(1,2) Cx(idx2(1),2)], 'Color', 'red', 'LineWidth', 2)
line([Cx(idx2(1)+1,1) Cx(idx2(2),1)], [Cx(idx2(1)+1,2) Cx(idx2(2),2)], 'Color', 'red', 'LineWidth', 2)
于 2012-08-03T14:46:07.370 に答える