gpt4 book ai didi

performance - Eigen - 计算两组向量之间的距离矩阵

转载 作者:行者123 更新时间:2023-12-04 12:51:42 35 4
gpt4 key购买 nike

我需要创建一个特征数组,其中包含每个源和记录器位置之间的所有距离。

我有三个 Eigen::Array sx、sy 和 sz 表示源位置,三个 Eigen::Array rx、ry 和 rz 表示记录器位置。源和记录位置阵列的长度不必相同。

使用for循环我可以计算距离矩阵如下

Eigen::ArrayXf  sx, sy, sz;
Eigen::ArrayXf rx, ry, rz;
Eigen::ArrayXXf dist;

for (int s=0; s<nrSources; s++ ) {

for (int r=0; r<nrReceivers; r++) {

dist(h,g) = sqrt(pow(rx(h)-sx(g),2.)+
pow(ry(h)-sy(g),2.)+
pow(sz(h)-sz(g),2.));
}
}

我需要为实验计算 500 x 1000 次的 dist 数组。使用 for 循环显然有效,但它可能不是最有效的方法,因为它没有使用矢量化。

将 sx、sx、sz 和 hx、hy 和 hz 重写为 sxyz 和 hxyz 数组应该是可能的。

是否可以更有效地编写方程!?

最佳答案

您可能希望放弃内部循环以支持表达式。通过这样做,我们允许将计算集中在一起,并有望实现矢量化。假设 rs变量被声明为 Eigen::ArrayX3f sxyz(nrSources,3), rxyz(nrReceivers,3); ,然后您可以将外循环写为:

for (int s = 0; s < nrSources; s++)
{
dist.col(s) =
(rxyz.rowwise() - sxyz.row(s)).matrix().rowwise().norm();
}

这里我们使用 rxyz.rowwise() - sxyz.row(s)减去第 s 个 s来自所有 r s。 matrix()需要访问 norm() .

对您的实现进行基准测试并进行比较。

关于performance - Eigen - 计算两组向量之间的距离矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35273292/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com