'候选模板被忽略:替换失败'错误帮助,C ++,Armadillo,rank(),

时间:2017-03-02 00:38:22

标签: c++ templates armadillo

我正在玩C ++犰狳库而没有做任何严肃的事情。但是,我收到了一个我不知道要处理的错误。我只是熟悉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.

1 个答案:

答案 0 :(得分:1)

根据Mat class的文档,rank()函数仅适用于包含 float {{1}类型元素的矩阵} double std::complex<float>

std::complex<double>矩阵类型将元素存储为无符号整数。 (整数的宽度取决于您的操作系统是32位还是64位以及编译器是使用旧的C ++ 98标准还是更新的C ++ 11标准;请参阅here)。

为了让您的代码正常运行,请将umat更改为umat。换句话说,而不是mat使用umat M(i,i);

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

rank()