近くの隣人は計算を意味します皆さんこんにちは、
たとえば、次のような3x3ボックスで、マイクロエレクトロニクスウェーハ上の隣接するダイ/コンポーネントの平均を計算する必要があります。

参照コンポーネントはボックスの中央にあるため、データテーブルの各行について、平均を計算する8つのコンポーネントで囲まれています(5x5ボックスと15個の隣接コンポーネントについて同じことを計算します...)
機械学習の新機能として使用されます。
私のコードは:
dt = current data table();
<BR />// building the KD table
matrice = (dt:row << getvalues) || (dt:col << getvalues);
table = KDTable(matrice);
for( i=1, i<=nrows(dt),i++,
// get the 3x3 neighbors
neighbors = table << Knearestrows(8,i);
neighbors_number = neighbors[1,1];
// Select the neighbors and get their metrics values and calculate the mean<BR /> dt << select rows (neighbors_number );
mean_selection = Col Mean( If( Selected(), :metric, . ) );
:mean_metric[i] = mean_selection;
dt << clear select
);誰かがその計算をより効率的に行うための賢い方法を持っていますか?
ありがとう!
スクリプティングRe:隣人は計算を意味します効率がどのように比較されるかはわかりませんが、ここに試してみるための代替手段があります。
- begin / end data update()を使用すると、どのメソッドでも役立ちます
- 最近傍を使用するのは賢いです(そしておそらくもっと効率的です)が、隣接するものがすべて片側にあるウェーハのエッジでさえ、常に最も近い8を返すことに注意してください。
- 行列の添え字は、Col Mean()よりも効率的です。
dt = current data table();
metrics = dt[0, "metric"];
rows = dt[0, "row"];
cols = dt[0, "col"];
d = 1; // 1 => 3x3, 2 => 5x5
dt << Begin Data Update();
For Each Row(
neighbors = Loc( :col - d <= cols <= :col + d & :row - d <= rows <= :row + d );
mean all = Mean( metrics[neighbors] );
nn = N Rows( neighbors );
mean without center = (mean all * nn - :metric) / (nn - 1);
:mm = mean without center;
);
dt << End Data Update();
Re:隣人は計算を意味します問題のサイズによって、kdtable()アプローチとloc()アプローチのどちらが優れているかが決まると確信しています。 loc()は10x10以下の行列で勝ち、kdtableは100x100以上で勝つと思います。
エッジに関するXanのポイントは重要です。 Loc()は、正しい答えを得る最も簡単な方法かもしれません。
Re:隣人は計算を意味しますとてもおもしろいです、ありがとうございました!
「データ更新開始」を使うこともありますが、ここでは考えていませんでした。良い点です。 それで、私が見つけた20,000行の更新の開始を追加すると、Loc()ソリューションは実際にはknearestrows()よりも少し遅くなります。
更新を開始しない古いスクリプト:116秒!
更新開始のknearestrows():5秒
更新開始のLoc():14秒
しかし、ニーレストローについては、開始/終了の更新で選択した行を使用できなくなったため、平均の計算方法を変更する必要がありました。
あなたが完全に正しいエッジのために、私は入れることを考えていました:
neighbors = table << Knearestrows({8,1.5}、i);
限られた半径を使用してこの問題を回避するには
再度、感謝します!
Re:隣人は計算を意味します一方、配列に余分な要素が含まれているため、半径制限の解は完全ではないことに気付きました。
たとえば、半径1.5には値2が含まれます。これは、ネイバーの検索を停止する値だからです。 だから、それは私が欲しいものを正確に私に与えません、私はもう少し検索する必要があります!
Re:隣人は計算を意味します不足している値の行と列を左、右、上、下に十分に埋めることができます。近隣を拡張する距離によっては、実際のウェーハの周囲に8つの完全な欠測ウェーハがある場合があります。
これを行う別の方法があり、ダミーの行と列も必要です。これは非常に高速です。
JMP 2Dマトリックスは、1D線形マトリックスとしてインデックスを付けることができます。
[1 2、
3 4、
5 6](3行、2列)
またのように見えます
[1、
2、
3、
4、
5、
6](6行、1つの添え字を使用する場合は1列)
ウェーハがNRowsx NColsの場合は、3NRows x 3NCols行列の中央に配置します(これをM3と呼びます)。
1を追加して水平方向に移動し、3NColを追加して垂直方向に移動することにより、インデックスM3に1D添え字のマトリックスを作成できます。 M3から3x3の部分行列を抽出するには、インデックス行列とshape()関数を使用します。
このようなもの:
M3 = [. . . . . . . . .,
. . . . . . . . .,
. . . . . . . . .,
. . . 1 2 3 . . .,
. . . 4 5 6 . . .,
. . . 7 8 9 . . .,
. . . . . . . . .,
. . . . . . . . .,
. . . . . . . . .];
indexer2x2 = [1 2 10 11]; // top left 2x2 sub-matrix
For( x = 2, x <= 5, x += 1,
For( y = 2, y <= 5, y += 1,
Write( "\!n ", x, " ", y, " ", Shape( M3[indexer2x2 + x + y * 9], 2 ) );
)
);
2 2 [。 。、。 1]
2 3 [。 1、。 4]
2 4 [。 4、。 7]
2 5 [。 7、 。 。]
3 2 [。 。、1 2]
3 3 [1 2、4 5]
3 4 [4 5、7 8]
3 5 [7 8 、。 。]
4 2 [。 。、2 3]
4 3 [2 3、5 6]
4 4 [5 6、8 9]
4 5 [8 9、。 。]
5 2 [。 。、3。]
5 3 [3。、6。]
5 4 [6。、9。]
5 5 [9。、。 。]
あなたもこれが必要かもしれません: 2DマトリックスでのLocの使用
indexer3x3などを作成し、レベルごとにM3を再利用できます。 forループx = 3、x <= 5は、毎回少し先に進む必要があります。
編集:インデックス付き要素の平均を取得しているだけの場合、形状関数は不要な場合がありますが、上記で何が起こったかを示すのに役立ちます。詳細:JSLマトリックスは、インデックスが1未満の場合に特別な動作をし、期待するエラーメッセージが表示されません。インデクサーにゼロ(または-1など)が含まれている場合、それは非常に奇妙に見えます。
Re:隣人は計算を意味しますこんにちは@Franck_R 、
おそらくこれもあなたを助けることができます:アドイン:空間データ分析
あなたが探しているのが空間相関であるならば、モランの私はおそらく最も基本的な概念です。
ロン
Re:隣人は計算を意味しますこれをすべてありがとう、私はそれをもっと深く掘り下げるつもりです