我認爲合適的解決方案是將此功能抽象爲一個函數。該功能可能是模板化的;它可能會使用一個循環 - 畢竟,循環會很短。許多矩陣操作都是使用循環實現的 - 這不是問題。
例如,給出你的例子...
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
你不得不基準,這是最快的,但我也不會驚訝地看到環奪冠,我希望這是更也可讀。