使用C++ Eigen库实现矩阵减均值向量广播减法遇错求助
Eigen矩阵与均值向量广播减法异常问题排查
问题代码
Vector3d mean; mean << 2, 3, -1; MatrixXd pts(5, 3); pts << 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0; MatrixXd results(5, 3); results = pts.colwise() - mean;
异常输出
-2.00000 -2.00000 -2.00000 -2.00000 -3.00000 -3.00000 1.00000 2.00000 1.00000 -2.00000 -2.00000 ovf -3.00000 -3.00000 0.00000
错误原因
你使用了colwise()方法,该方法会对矩阵的每一列执行减法操作。但你的pts是5行3列矩阵,每列包含5个元素,而mean是3元素列向量,二者维度不匹配,导致内存越界和计算溢出(输出中的ovf即overflow)。
你的需求是让矩阵的每一行(每个点)减去均值向量,因此应该使用行维度的广播操作。
修正方案
方案1:使用rowwise()配合转置
将mean转成行向量,通过rowwise()让矩阵每行都减去该均值行向量:
results = pts.rowwise() - mean.transpose();
方案2:复制均值向量至匹配维度
将mean复制成与pts行数相同的矩阵,直接执行逐元素减法:
results = pts - mean.replicate(pts.rows(), 1);
正确输出
-2 -3 1 -1 -3 1 -2 -2 1 -2 -3 2 -1 -2 1
内容的提问来源于stack exchange,提问作者P_B
相关产品推荐
相关产品推荐

