问题描述
根据 Armadillo
文档:
.i()
Member function of any matrix expression
Provides an inverse of the matrix expression
...
但是,当我尝试编译此代码段时:
#include <armadillo>
#include <iostream>
arma::sp_mat linReg(arma::sp_mat X,arma::sp_mat Y) {
return (X.t() * X).i() * X.t() * Y;
}
int main() {
arma::sp_mat X = arma::sprandu(1000,10,0.3);
arma::sp_mat y = arma::sprandu(1000,0.3);
std::cout << linReg(X,y).t() << std::endl;
}
我收到以下错误
lreg.cpp: 在函数‘arma::sp_mat linReg(arma::sp_mat,arma::sp_mat)': lreg.cpp:6:24: 错误:'arma::enable_if2
我已经尝试过 mat
并且效果很好。任何线索为什么它不适用于稀疏矩阵?如果是这样,我们如何计算稀疏矩阵的逆矩阵?
解决方法
通常不需要对稀疏矩阵求逆,因为您最终会得到一个稠密矩阵。通常不需要显式逆。
与其在这里取逆,不如将问题视为求解线性方程组。然后使用 solve() 或 spsolve() 重新表述。下面是一个未经测试的示例,用于演示一般方法:
arma::mat linReg(const arma::sp_mat& X,const arma::sp_mat& Y) {
arma::sp_mat A = X.t() * X;
arma::mat B = arma::mat(X.t() * Y); // convert to dense matrix
arma::mat result;
bool ok = arma::spsolve(result,A,B);
if(ok == false) {
// handle failure here
}
return result;
}