Eigen::MatrixXf按列减对应列最小值触发断言错误,求解决
问题分析与解决方案
错误原因
你遇到的断言错误是维度不匹配导致的:
mat.colwise().minCoeff()返回的是一个列向量(VectorXf类型,维度为2009×1,对应2009列的最小值)mat.colwise() -= minVal试图将矩阵的每一列(113×1)与2009×1的列向量做减法,Eigen无法完成这种维度不匹配的操作,触发断言检查。
修正代码
你需要让最小值向量能被广播到矩阵的每一列,最简单的方式是将列向量转成行向量,结合rowwise()操作实现逐列减最小值:
VectorXf minVal = mat.colwise().minCoeff(); mat.rowwise() -= minVal.transpose();
原理说明
minVal.transpose()将2009×1的列向量转为1×2009的行向量mat.rowwise() -= ...会让矩阵的每一行,都减去行向量中对应位置的元素——等价于矩阵的每一列,都减去该列的最小值,完全符合你的需求。
另一种实现方式
也可以通过构造与原矩阵同维度的最小值矩阵,直接做减法:
VectorXf minVal = mat.colwise().minCoeff(); mat -= minVal.transpose().replicate(mat.rows(), 1);
这里minVal.transpose().replicate(mat.rows(), 1)会生成一个113×2009的矩阵,每一行都是最小值行向量,与原矩阵直接相减即可完成逐列去最小值的操作。
内容的提问来源于stack exchange,提问作者Nick X Tsui
相关产品推荐
相关产品推荐

