我试图从 lapack lib 调用
F77_NAME(dgeqrf)
函数,但程序崩溃了。
你觉得哪里不对?
#include <R.h>
#include <R_ext/BLAS.h>
#include <R_ext/Lapack.h>
#include <stdio.h>
double* getcopy(int* nrow, int* ncol, double* a) {
double* copy = malloc(*nrow * *ncol * sizeof(double));
int i;
for (i = 0; i < *nrow * *ncol; i++) {
copy[i] = a[i];
}
return copy;
}
int main() {
int m = 3, n = 3;
double a[] = {12, -51, 4, 6, 167, -68, -4, 24, -41};
double* acopy = getcopy(&m, &n, a);
double tau[3];
int info = 0;
int i;
int one = 1;
double* work = malloc(max(&one, &m) * sizeof(double));
int lwork = 0;
int lda = max(&m, &n);
F77_NAME(dgeqrf)(&m, &n, acopy, &m, tau, work, &lwork, &info);
for (i = 0; i < m * n; i++) printf("%f", acopy[i]);
return 0;
}
来自 dgeqrf.f 源代码:
* LWORK (input) INTEGER
* The dimension of the array WORK. LWORK >= max(1,N).
* For optimum performance LWORK >= N*NB, where NB is
* the optimal blocksize.
*
* If LWORK = -1, then a workspace query is assumed; the routine
* only calculates the optimal size of the WORK array, returns
* this value as the first entry of the WORK array, and no error
* message related to LWORK is issued by XERBLA.
因此,如果您想要最佳运行,您首先需要调用该函数并将“lwork”设置为-1,以获得“work”的最佳大小。