我正在玩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.
答案 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()