我认为合适的解决方案是将此功能抽象为一个函数。该功能可能是模板化的;它可能会使用一个循环 - 毕竟,循环会很短。许多矩阵操作都是使用循环实现的 - 这不是问题。
例如,给出你的例子...
MatrixXd p0(2, 4);
p0 <<
1, 23, 6, 9,
3, 11, 7, 2;
MatrixXd p1(2, 2);
p1 <<
2, 20,
3, 10;
然后我们可以构建一个矩阵d使得d(I,J)= | (i) - p (i) - p (j)|
MatrixXd D(p0.cols(), p0.rows());
for (int i = 0; i < p1.cols(); i++)
D.col(i) = (p0.colwise() - p1.col(i)).colwise().squaredNorm().transpose();
我觉得这是很好 - 我们可以使用一些广播避免2层嵌套:我们遍历p的点,但不超过p的积分,也不超过它们的尺寸。
但是,如果您观察到了这种情况,您可以制作一个oneliner | (i) - p (i) - p (j)| = | p (i)| + | p (j)| - 2 p (ⅰ)Ťp (j)的。尤其是,最后的组件只是矩阵乘法,所以d = -2 pŤp + ...
坯件离开待填充是由仅取决于行的组件组成;以及仅取决于列的组件:这些可以使用rowwise和columnwise操作来表示。
最后的 “oneliner” 则是:
D = ((p0.transpose() * p1 * -2
).colwise() + p0.colwise().squaredNorm().transpose()
).rowwise() + p1.colwise().squaredNorm();
您也可以与(外)的产物与矢量更换横行/ colwise欺骗。
两种方法都导致以下(平方)距离:
1 410
505 10
32 205
50 185
你不得不基准,这是最快的,但我也不会惊讶地看到环夺冠,我希望这是更也可读。