matlab中blas库的学习

来源:互联网 发布:2017网络手游排行榜 编辑:程序博客网 时间:2024/04/28 12:11

example: dgemm函数

1 入口参数:

void dgemm(    char   *transa,    char   *transb,    ptrdiff_t *m,    ptrdiff_t *n,    ptrdiff_t *k,    double *alpha,    double *a,    ptrdiff_t *lda,    double *b,    ptrdiff_t *ldb,    double *beta,    double *c,    ptrdiff_t *ldc);

2 功能介绍:
C=αAB+βC或者C=αATB+βC
其中 transatransb分别代表B和C是否进行转置,若不转置为参数"N",转置为"T"m n k lda ldb ldc代表相应的维数;αbeta分别代表系数的大小。
下面先介绍不转置的情况:
此时,m为矩阵A的行数,n为矩阵B的列数,k为矩阵A的列数或者矩阵B的行数,ldaldbldc分别为矩阵ABC的行数。
下来,介绍一下转置的情况:
此时,m为矩阵A转置后的行数,n为矩阵B的列数,k为矩阵A转置后的列数或者矩阵B的行数,ldaldbldc分别为矩阵ABC的行数。
下面是代码实现C = A*B 的代码

    #if !defined(_WIN32)#define dgemm dgemm_#endif#include "mex.h"#include "blas.h"void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){    double *A, *B, *C; /* pointers to input & output matrices*/    size_t m,n,p;      /* matrix dimensions */    /* form of op(A) & op(B) to use in matrix multiplication */    char *chn = "N";    /* scalar values to use in dgemm */    double one = 1.0, zero = 0.0;    A = mxGetPr(prhs[0]); /* first input matrix */    B = mxGetPr(prhs[1]); /* second input matrix */    /* dimensions of input matrices */    m = mxGetM(prhs[0]);      p = mxGetN(prhs[0]);    n = mxGetN(prhs[1]);    if (p != mxGetM(prhs[1])) {        mexErrMsgIdAndTxt("MATLAB:matrixMultiply:matchdims",                "Inner dimensions of matrix multiply do not match.");    }    /* create output matrix C */    plhs[0] = mxCreateDoubleMatrix(m, n, mxREAL);    C = mxGetPr(plhs[0]);    /* Pass arguments to Fortran by reference */    dgemm(chn, chn, &m, &n, &p, &one, A, &m, B, &p, &zero, C, &m);}

下面是代码实现C=ATB的代码

#if !defined(_WIN32)#define dgemm dgemm_#endif#include "mex.h"#include "blas.h"void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){    double *A, *B, *C; /* pointers to input & output matrices*/    size_t m,n,p,k;      /* matrix dimensions */    /* form of op(A) & op(B) to use in matrix multiplication */    char *chn = "N";    char *cht = "T";    /* scalar values to use in dgemm */    double one = 1.0, zero = 0.0;    A = mxGetPr(prhs[0]); /* first input matrix */    B = mxGetPr(prhs[1]); /* second input matrix */    /* dimensions of input matrices */    m = mxGetM(prhs[0]);      p = mxGetN(prhs[0]);    n = mxGetN(prhs[1]);    k = mxGetM(prhs[1]);    /* create output matrix C */    plhs[0] = mxCreateDoubleMatrix(p, n, mxREAL);    C = mxGetPr(plhs[0]);    /* Pass arguments to Fortran by reference */    dgemm(cht, chn, &p, &n, &m, &one, A, &m, B, &k, &zero, C, &p);}
0 0
原创粉丝点击