从 lapack 库调用 F77_NAME() 函数时我的代码崩溃了

问题描述 投票:0回答:1

我试图从 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;
}
c r lapack
1个回答
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”的最佳大小。

© www.soinside.com 2019 - 2024. All rights reserved.