我试图在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的正确参数?感谢。
答案 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是一个上三角矩阵。
如需进一步阅读,我建议您使用以下链接:
但是,你想要一个例子。这是:
/** 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;
}