Я хочу сделать именно то, что делает rcond в MATLAB / Octave, используя LAPACK из C. В руководстве MATLAB сказано, что dgecon используется, и это основано на норме, основанной на 1.
Я написал простой тестпрограмма для предельно простого случая;[1,1;1,0] Для этого ввода Matlab и октава дают мне 0,25 с использованием rcond и 1 / cond (x, 1), но в случае с использованием LAPACK, этот пример программы печатает 0.0.Для других случаев, таких как идентификация, печатается правильное значение.
Поскольку MATLAB, по-видимому, действительно успешно использует эту процедуру, что я делаю неправильно?Я пытаюсь расшифровать то, что делает Octave, с небольшим успехом, так как он упакован в
#include <stdio.h>
extern void dgecon_(const char *norm, const int *n, const double *a,
const int *lda, const double *anorm, double *rcond, double *work,
int *iwork, int *info, int len_norm);
int main()
{
int i, info, n, lda;
double anorm, rcond;
double w[8] = { 0,0,0,0,0,0,0,0 };
int iw[2] = { 0,0 };
double x[4] = { 1, 1, 1, 0 };
anorm = 2.0; /* maximum column sum, computed manually */
n = 2;
lda = 2;
dgecon_("1", &n, x, &lda, &anorm, &rcond, w, iw, &info, 1);
if (info != 0) fprintf(stderr, "failure with error %d\n", info);
printf("%.5e\n", rcond);
return 0;
}
Скомпилировано с cc testdgecon.c -o testdgecon -llapack;./testdgecon