C++ 计算密集特征::矩阵中所有行之间距离的最快方法
我试图用特征值计算1000x1000矩阵中每对行之间的欧几里德距离。到目前为止,我得到的是以下几点:C++ 计算密集特征::矩阵中所有行之间距离的最快方法,c++,performance,eigen,C++,Performance,Eigen,我试图用特征值计算1000x1000矩阵中每对行之间的欧几里德距离。到目前为止,我得到的是以下几点: for (int i = 0; i < matrix.rows(); ++i){ VectorXd refRow = matrix.row(i); for (int j = i+1; j < matrix.rows(); ++j){ VectorXd eleRow = matrix.row(j); euclid_
for (int i = 0; i < matrix.rows(); ++i){
VectorXd refRow = matrix.row(i);
for (int j = i+1; j < matrix.rows(); ++j){
VectorXd eleRow = matrix.row(j);
euclid_distance = (refRow - eleRow).lpNorm<2>();
...
}
}
for(int i=0;i
我的代码包括其他代码,这里用“…”替换,但为了测试性能,我删除了它
现在我不希望它以光速运行,但它比我预期的要快得多。使用C++可能会减慢这个特性库吗?
是否有其他首选方法?您是否能够指定矩阵的长度?从缓存效率的角度来看,您应该使用行主排序,这不是默认的。实际上,我自己刚刚发现了这一点,并尝试切换它,仍在等待计时结果进行比较,但在遍历矩阵时,您仍需要很长时间来复制行;不要那样做。明确使用
.row()
值;Eigen的表达式模板引擎应该有效地实现这一点(即,它将引用已经存在的矩阵中的值,而不是复制它们)。例如:euclid_距离=(matrix.row(i)-matrix.row(j)).lpNorm()代码>同样,我会定义一个很长的时间。您是否启用了优化功能?VS2013在默认发布模式设置下运行良好,1000x1000矩阵需要4.5分钟,我是否期望过高(我知道应该需要一段时间)?