近邻均值计算嗨,大家好,
我必须计算微电子晶圆上的相邻管芯/组件的平均值,例如在3x3盒子上,如下所示:
我的代码是:
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
);有没有人聪明的方法可以更有效地进行计算?
谢谢!
脚本编写回复:近邻均值计算我不确定效率如何比较,但是这是您尝试的替代方法。
- 使用开始/结束数据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();
回复:近邻均值计算我很确定问题的大小将确定kdtable()还是loc()方法是否更好。 我猜想loc()会赢得10x10或更小的矩阵,而kdtable会赢得100x100或更大的矩阵。
Xan关于边缘的观点很重要。 Loc()可能是获得正确答案的最简单方法。
回复:近邻均值计算非常感谢,这非常有趣!
有时我会使用“开始数据更新”,但是我在这里没有想到:很好。 这样,如果添加我发现的20,000行的开始更新,则Loc()解决方案实际上比knearestrows()慢一点:
没有开始更新的旧脚本:116s!
knearestrows()开始更新:5秒
Loc()开始更新:14秒
但是对于knearestrows,我不得不更改计算均值的方式,因为我们不能再在开始/结束更新中使用选择行。
对于您完全正确的边缘,我曾考虑过放入:
邻居=表<< Knearestrows({8,1.5},i);
为避免此问题,请使用有限的半径
再次感谢!
回复:近邻均值计算另一方面,我意识到半径限制的解决方案并不完美,因为我们仍然在数组中添加了一个额外的元素
例如半径1.5包含2的值,因为这是阻止邻居搜索的值... 因此,它并不能完全满足我的需求,我还需要搜索更多!
回复:近邻均值计算您可以填充缺少的值(左,右,上,下)的行和列。根据扩展邻域的距离,您可能会在实际晶圆周围有8个完全缺失值的晶圆。
还有另一种方法,也需要虚拟行和列,这将非常快:
JMP 2D矩阵可以索引为1D线性矩阵。
[1 2
3 4
5 6](3行2列)
也看起来像
[1
2,
3,
4,
5
6](6行,使用一个下标时为1列)
如果晶片是NRows x NCols,则将其放在3NRows x 3NCols矩阵的中间(我将其称为M3)。
您可以通过添加1来水平移动并添加3NCols来垂直移动,从而为索引M3创建一维下标矩阵。 要从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。,。 。]
您可能也需要此:将Loc与2D矩阵配合使用
您可以制作indexer3x3等,然后仅在每个级别重用M3。 for循环x = 3,每次x <= 5都需要走得更远。
编辑:如果只是获取索引元素的均值,则可能不需要shape函数,但它有助于显示上面发生的情况。更多:当索引小于1时,JSL矩阵具有特殊的行为,您将不会收到您希望的错误消息!如果索引器包含零(或-1等),它将看起来很奇怪。
回复:近邻均值计算你好@Franck_R ,
也许这也可以帮助您:加载项:空间数据分析
如果您要寻找的是空间相关性,那么Moran的I也许是最基本的概念。
罗恩
回复:近邻均值计算感谢所有这些,我将更深入地研究它