访问Armadillo稀疏复矩阵元素

Accessing Armadillo sparse complex matrix elements

本文关键字:元素 Armadillo 访问      更新时间:2023-10-16

我有以下功能:

double Qi(int i) {
    double val = 0.0;
    for (int j = 0; j < Model.buses.size(); j++)
        val += Sol.V[j] * (Y[i, j].real() * sin(Sol.D[i] - Sol.D[j]) - Y[i, j].imag() * cos(Sol.D[i] - Sol.D[j]));
    return Sol.V[i] * val;
}

变量Y是来自犰狳库SpValProxy<arma::SpMat<std::complex<double> > >的复稀疏矩阵。问题是编译器告诉我不能访问特定矩阵元素的实部或虚部。

错误如下:

error: ' class arma::SpValProxy>> '没有名为' real '的成员

我不知道该怎么做才能访问复稀疏矩阵的复数属性。

SpValProxy用作元素保护,以捕获不存储在稀疏矩阵中的零值。

你需要像这样通过警卫:

std::complex<double> temp = Y(i,j);

然后访问temp的实部和虚部,或者,将Y更改为对矩阵的const引用,这将告诉Armadillo直接绕过守卫。

还有,你有一个bug: Y[i,j]没有做你认为它做的事情。在c++中,[]表达式中只使用一个索引。使用Y(i,j)代替。

这也可以用更直接的方式工作:

const sp_cx_mat& YY = Y;
// can now access .real() and .imag() directly:
double re = YY(i,j).real();
double im = YY(i,j).imag();