C++ 使用两倍于预期内存的用户定义本征函数

C++ 使用两倍于预期内存的用户定义本征函数,c++,matrix,eigen,C++,Matrix,Eigen,我已经定义了以下函数(MWE) (注意,该公式是对该公式的改编:,以及) #包括 #包括 #包括 #包括 使用MyMatrix=Eigen::MatrixXd; 使用MyMatrix1D=Eigen::VectorXd; //计算e^(标度*| | | x-y | | | | | u 2^2),其中| | x-y | |是欧氏距离 MyMatrix获取内核矩阵(常数特征::Ref x,常数特征::Ref y) { 常数双刻度=0.017; 常量MyMatrix1D XX=x.array().sq

我已经定义了以下函数(MWE)

(注意,该公式是对该公式的改编:,以及)

#包括
#包括
#包括
#包括
使用MyMatrix=Eigen::MatrixXd;
使用MyMatrix1D=Eigen::VectorXd;
//计算e^(标度*| | | x-y | | | | | u 2^2),其中| | x-y | |是欧氏距离
MyMatrix获取内核矩阵(常数特征::Ref x,常数特征::Ref y)
{
常数双刻度=0.017;
常量MyMatrix1D XX=x.array().square().rowwise().sum().matrix();
常量MyMatrix1D YY=y.array().square().rowwise().sum().matrix();
返回(;
}
int main(int argc,字符**argv){
常数int num_x=2500;
常数int num_y=2500;
常量MyMatrix X=MyMatrix::Random(num_X,2);
常量MyMatrix Y=MyMatrix::Random(num_Y,2);
const auto t_b_gen=std::chrono::high_resolution_clock::now();
常量MyMatrix k_xp_x(std::move(get_kernel_matrix(x,Y));
const auto t_a_gen=std::chrono::high_resolution_clock::now();
long t_gen=std::chrono::duration_cast(t_a_gen-t_b_gen).count();

std::cout这是因为默认情况下,矩阵乘积
x*y.transpose()
在一个临时表达式中求值,以提高其效率。您仍然可以通过拆分最后一个表达式来重用此临时表达式,如下所示:

MyMatrix tmp = -2*x*y.transpose();
tmp = ((((tmp).colwise() + XX).rowwise() + YY.transpose()).array() * scale).exp();
return tmp;

请注意,此处既不需要
.matrix()
,也不需要
std::move

挑剔之处:从函数调用移动到
get\u kernel\u matrix()
)没有必要,因为该表达式已经是prvalue。删除显式移动可能不会修复它,但至少不会增加内存消耗。初始化
k_xp_x
也很有趣,只需执行
const auto k_xp_x=get_kernel_matrix();
。甚至是
const auto&
。基本上首先让编译器完成它的工作,并且仅当它在没有约束的情况下工作时才对其进行约束。在返回表达式的末尾是否需要
.matrix()
MyMatrix tmp = -2*x*y.transpose();
tmp = ((((tmp).colwise() + XX).rowwise() + YY.transpose()).array() * scale).exp();
return tmp;