任何人都可以在openblas中向我展示dspr函数的示例

时间:2013-12-28 14:49:29

标签: rcpp blas

我试图在Openblas中使用带有Rcpp的函数dspr。 dspr的目的是:

A := alpha*x*x**T + A

在我的情况下,首先我将A定义为矩阵,所有元素都是0, alpha=1, x=(1,3),因此,最终矩阵A应该是{(1,3),(3,9)},但我从来没有得到正确的结果,我将参数设置如下:

cblas_dspr(CblasColMajor,CblasUpper,2, 1, &(x[0]),1, &(A[0]));

谁能告诉我如何设置dspr的正确参数?感谢。

2 个答案:

答案 0 :(得分:0)

我机器上的文件/usr/include/cblas,h显示BLAS C接口的以下签名:

void cblas_dspr(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
                const int N, const double alpha, const double *X,
                const int incX, double *Ap);

试试吧。您可以通过x.begin()&(x[0])获得Rcpp向量的开头。

尽管如此,Rcpp没有任何相关内容。

答案 1 :(得分:0)

从您自己的帖子中重复:BLAS二元产品执行 答:= alpha * x * x'+ A

所以A需要用零值初始化。 另外不要忘记A是一个上三角矩阵。

如需进一步阅读,我建议您使用以下链接:

https://developer.apple.com/library/ios/documentation/Accelerate/Reference/BLAS_Ref/Reference/reference.html

https://github.com/foundintranslation/Kaldi/blob/master/tools/ATLAS/interfaces/blas/C/src/cblas_dspr.c

但是,你想要一个例子。这是:

/** dspr_demo.cpp */

#include <cblas.h>
#include <iostream>
#include <cstdlib>

using namespace std;

int main(int argc, char** argv)
{
  int n=2;
  double* x = (double*)malloc(n*sizeof(double));
  double* upperTriangleResult = (double*)malloc(n*(n+1)*sizeof(double)/2);

  for (int j=0;j<n*(n+1)/2;j++) upperTriangleResult[j] = 0;
  x[0] = 1; x[1] = 3;

  cblas_dspr(CblasRowMajor,CblasUpper,n,1,x,1,upperTriangleResult);
  double*& A = upperTriangleResult;
  cout << A[0] << "\t" << A[1] << endl << "*\t" << A[2] << endl;

  free(upperTriangleResult); free(x);
  return EXIT_SUCCESS;
}