Thanks.
Does "FFPACK::pPLUQ" or "FFPACK::PLUQ" return the rank?
It seems that ffpack.h says so, but the following short code
when applied to a 768x768 matrix
http://www.kurims.kyoto-u.ac.jp/~tshun/4321mas
"./test_pluq 3 gram4_3_2_1_ p" or ."/test_pluq 3 gram4_3_2_1_ -"
returns 768. This matrix has rank=41 in char=3.
Am I missing some points trivially important?
Sincerely,
Shunsuke
#include "fflas-ffpack/fflas-ffpack-config.h"
#include <iostream>
#include <givaro/modular.h>
#include "fflas-ffpack/config-blas.h"
#include "fflas-ffpack/fflas/fflas.h"
#include "fflas-ffpack/utils/timer.h"
#include "fflas-ffpack/utils/Matio.h"
#include "fflas-ffpack/utils/args-parser.h"
#include "fflas-ffpack/field/nonzero-randiter.h"
#include "tests/test-utils.h"
#ifdef __FFLASFFPACK_USE_KAAPI
#include "libkomp.h"
#endif
using namespace std;
//typedef Givaro::ModularBalanced<double> Field;
//typedef Givaro::ZRing<double> Field;
typedef Givaro::ZRing<double> Field;
//typedef Givaro::UnparametricZRing<double> Field;
int main(int argc, char** argv) {
int m,n;
Field F(atof(argv[1]));
Field::Element * A;
A = read_field(F,argv[2],&m ,&n);
const int t=12;
bool par=(argv[3][0]=='p');
cout << "is parallel? " << boolalpha << par << endl;
size_t R;
enum FFLAS::FFLAS_DIAG diag = FFLAS::FflasNonUnit;
size_t maxP, maxQ;
maxP = m;
maxQ = n;
size_t *P = FFLAS::fflas_new<size_t>(maxP);
size_t *Q = FFLAS::fflas_new<size_t>(maxQ);
if (par) {
PAR_BLOCK{
R = FFPACK::pPLUQ(F, diag, m, n, A, n, P, Q, t);
}
}
else
R = FFPACK::PLUQ(F, diag, m, n, A, n, P, Q);
cout << m << "x" << n << " matrix." << endl;
cout << "rank = " << R << endl;
FFLAS::fflas_delete (P);
FFLAS::fflas_delete (Q);
FFLAS::fflas_delete (A);
return 0;
}
2015年6月16日火曜日 16時59分32秒 UTC+9 Clement Pernet: