ブール配列「ベクトル」が「マトリックス」の列から線形に独立しているかどうかを確認する必要があるプロジェクトを行っています。MATLAB では、rank(gf([matrix vector])) コマンドを使用して、拡張行列 [matrix vector] のランクを見つけることで実行できます。'gf' は行列がブール値であるためです。しかし、C ++でそれを行う方法。これは私が試したことです:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "engine.h"
#define BUFSIZE 256
int main()
{
Engine *ep;
mxArray *M = NULL, *V = NULL, *result = NULL;
bool matrix[4][4]={1,1,1,0,0,1,1,0,0,1,0,0}, vector[4][1]={1,1,1,1};
double *rank;
if (!(ep = engOpen("\0"))) {
fprintf(stderr, "\nCan't start MATLAB engine\n");
return EXIT_FAILURE;
}
V = mxCreateDoubleMatrix(4, 1, mxREAL);
M = mxCreateDoubleMatrix(4, 4, mxREAL);
memcpy((void *)mxGetPr(V), (void *)vector, sizeof(vector));
memcpy((void *)mxGetPr(M), (void *)matrix, sizeof(matrix));
engPutVariable(ep, "V", V);
engPutVariable(ep, "M", M);
engEvalString(ep, "R = rank(gf([M V]));");
result = engGetVariable(ep, "R");
engClose(ep);
rank = mxGetPr(result);
printf("%f", *rank);
printf("Done with LI\n");
mxDestroyArray(M);
mxDestroyArray(V);
mxDestroyArray(result);
engEvalString(ep, "close;");
}
上記のコードは機能し、望ましい結果が得られています。しかし、それは非常に遅いです。誰かがそれを速くする方法を私に提案できますか? または、ブール行列のランクを見つける他の方法を提案してください。いくつかのライブラリが出回っていますが、それらは int または double 行列に対してのみ関数を持っているようです。