犰狳 - 矩阵表达式中没有名为 i 的成员

问题描述

根据 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,arma::SpMat,arma::spglue_times> >::result’ {aka ‘const class arma::SpGluearma::SpOp<:spmat arma::spop_htrans>,arma::spglue_times>'} 没有名为“i”的成员 6 |返回 (X.t() * X).i() * X.t() * Y; |

我已经尝试过 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;
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...