我在玩C ++ armadillo库时没有做任何认真的事情。但是,我遇到了一个我不知道要处理的错误。我只是非常熟悉c ++,而且我真的不知道从哪里开始。无论如何,这是我的代码,它非常简单,它只是将1-6组成一个nxn矩阵,将其从1填充到n ^ 2,然后(尝试)打印该排名:

#include <iostream>
#include <armadillo>
#include <string>

using std::cout;
using std::to_string;
using std::string;
using namespace arma;


int main(int argc, char *argv[])
{
    int x = 1;
    int m,n = 0;

    for (int i=1; i<7; i++)
    {
        umat M(i,i);

        for (m=0; m<i; m++)
        {
            for (n=0; n<i; n++)
            {
                M(m,n) = (x+n+(i*m));
            }
        }

        string s = "M(" + to_string(i) + "x" + to_string(i) + "):";
        M.print(s);
        uword r = rank(M);
        cout << "rank(M): " << to_string( r )  << "\n";
        cout << "\n";
    }

    return (0);
}


我的终端输入/输出是:

$ g++ -o matrix matrix.cpp -larmadillo
matrix.cpp:35:13: error: no matching function for call to 'rank'
                uword r = rank(M);
                          ^~~~
/usr/local/include/armadillo_bits/fn_rank.hpp:22:1: note: candidate template ignored: substitution
      failure [with T1 = arma::Mat<unsigned int>]: no type named 'result' in
      'arma::arma_blas_type_only<unsigned int>'
rank
^ 1 error generated.

最佳答案

根据Mat class的文档,rank()函数仅适用于元素类型为floatdoublestd::complex<float>std::complex<double>的矩阵。

umat矩阵类型将元素存储为无符号整数。 (整数的宽度取决于您的OS是32位还是64位,以及编译器使用的是旧的C ++ 98标准还是更新的C ++ 11标准;请参见here)。

因此,要使代码正常工作,请将umat更改为mat。换句话说,使用umat M(i,i);代替mat M(i,i);

如果您确实需要在umat中将数据存储为整数,请使用conv_to()函数转换矩阵,然后再将其传递给rank()函数:

double r = rank( conv_to<mat>::from(M) );

10-07 18:55