我在玩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()
函数仅适用于元素类型为float
,double
,std::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) );