首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用CBLAS的外部产品

使用CBLAS的外部产品
EN

Stack Overflow用户
提问于 2013-11-07 19:37:40
回答 2查看 3K关注 0票数 2

我在使用CBLAS执行外部产品时遇到了困难。我的代码如下:

代码语言:javascript
复制
//===SET UP===//
double x1[] = {1,2,3,4};
double x2[] = {1,2,3};
int dx1 = 4;
int dx2 = 3;
double X[dx1 * dx2];
for (int i = 0; i < (dx1*dx2); i++) {X[i] = 0.0;}

//===DO THE OUTER PRODUCT===//
cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasTrans, dx1, dx2, 1, 1.0, x1, dx1, x2, 1, 0.0, X, dx1);

//===PRINT THE RESULTS===//
printf("\nMatrix X (%d x %d) = x1 (*) x2 is:\n", dx1, dx2);
for (i=0; i<4; i++) {
    for (j=0; j<3; j++) {
        printf ("%lf ", X[j+i*3]);
    }
    printf ("\n");
}

我得到:

代码语言:javascript
复制
Matrix X (4 x 3) = x1 (*) x2 is:
1.000000 2.000000 3.000000 
0.000000 -1.000000 -2.000000 
-3.000000 0.000000 7.000000 
14.000000 21.000000 0.000000 

但正确的答案是:示例

我见过:C中kronecker乘积的有效计算

但是,这对我没有帮助,因为他们并没有说如何利用dgemm来实现这一点.

有什么帮助吗?我在这里做错什么了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-08 03:49:25

您可以使用dger来实现它,但是使用dger在风格上更正确,dger是一个专用的外部产品实现。因此,正确使用比较容易:

代码语言:javascript
复制
cblas_dger(CblasRowMajor, /* you’re using row-major storage */
           dx1,           /* the matrix X has dx1 rows ...  */
           dx2,           /*  ... and dx2 columns.          */
           1.0,           /* scale factor to apply to x1x2' */
           x1,
           1,             /* stride between elements of x1. */
           x2,
           1,             /* stride between elements of x2. */
           X,
           dx2);          /* leading dimension of matrix X. */

dgemm确实有一个很好的特性,即传递\beta = 0可以为您初始化结果矩阵,这样您就不必在调用之前显式地将其归零。@Artem Shinkarov的回答很好地描述了如何使用dgemm。

票数 8
EN

Stack Overflow用户

发布于 2013-11-07 23:46:03

但是,在BLAS中,接口并不是很方便,但是,让我们试着找出它。首先,假设我们所有的矩阵都在RowMajor中。现在我们有了下面的设置

代码语言:javascript
复制
     row  col
x1:  dx1   1   (A)
x2:   1   dx2  (B)
 X:  dx1  dx2  (C)

现在,我们只需要根据文档来填充调用,这是根据

代码语言:javascript
复制
C = \alpha A*B + \beta C

所以我们得到:

代码语言:javascript
复制
cblas_dgemm (CblasRowMajor, CblasNoTrans, CblasNoTrans,
             (int)dx1, /* rows in A         */
             (int)dx2, /* columns in B      */
             (int)1,   /* columns in A      */
             1.0, x1,  /* \alpha, A itself  */
             (int)1,   /* Colums in A       */
             x2,       /* B itself          */
             (int)dx2, /* Columns in B      */
             0.0, X,   /* \beta, C itself   */
             (int)dx2  /* Columns in C  */);

这样就能完成我希望的工作了。以下是dgemm:链接参数的描述

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19845071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档