int p = X.rows();
Eigen::MatrixXd W = Eigen::MatrixXd::Random(p, p);
// 迭代
for (int i = 0; i < max_iter; i++) {
Eigen::MatrixXd W1 = W;
Eigen::MatrixXd gwtx = (W * X).array().tanh();
Eigen::MatrixXd g_wtx = (1 - gwtx.array().square()).matrix();
W = (gwtx * X.transpose()) / double(X.cols()) - (g_wtx.rowwise().sum() / double(X.cols())).asDiagonal() * W;
Eigen::MatrixXd M = (W.transpose() * W).inverse();
W = (M.sqrt()).eval() * W.transpose();
if ((W1 - W).array().abs().maxCoeff() < tol) {
break;
}
}
運行代碼后出現錯誤:
严重性 代码 说明 项目 路径 文件 行 源 禁止显示状态
错误 C2027 使用了未定义类型“Eigen::MatrixSquareRootReturnValue<Derived>” OPENCV5 E:\softtest C++\OPENCV5\OPENCV5 E:\softtest C++\OPENCV5\OPENCV5\FACE1.cpp 90 生成
一個時隱時現的錯誤:
严重性 代码 说明 项目 路径 文件 行 源 禁止显示状态
错误 C2440 “初始化”: 无法从“const Eigen::MatrixSquareRootReturnValue<Derived>”转换为“Eigen::Matrix<double,-1,-1,0,-1,-1>” OPENCV5 E:\softtest C++\OPENCV5\OPENCV5 E:\softtest C++\OPENCV5\OPENCV5\FACE1.cpp 90 生成
問了文心一言,修改:
在Eigen库中,.sqrt()
方法并不适用于矩阵。这是一个错误。对于矩阵,您需要使用.array().sqrt()
。
Eigen::MatrixXd M = (W.transpose() * W).inverse();
Eigen::MatrixXd sqrtM = M.array().sqrt();
記錄一下。