?GEMV_
List
sgemv_ | cblas_sgemv | 単精度実 数一般行列とベクトルの積 |
dgemv_ | cblas_dgemv | 倍精度実 数一般行列とベクトルの積 |
cgemv_ | cblas_cgemv | 単精度複素数一般行列とベクトルの積 |
zgemv_ | cblas_zgemv | 倍精度複素数一般行列とベクトルの積 |
概略
一般行列とベクトルの積を計算します。ベクトルが列ベクトルとして解釈される点に注意してください。結果は、渡したベクトルyに格納されます。計算式
y := alpha * Ax + beta * yサンプルコード
通常の実数の例#include <cblas.h> #include <stdio.h> int main(void) { int i,j; double A[2*3]={1.0,2.0,3.0, 4.0,5.0,6.0}; double x[3] ={1.0,2.0,3.0}; //(1 2 3)ベクトル(縦ベクトル) double y[2]; //(14 32)となれば良い cblas_dgemv(CblasRowMajor,//通常のCの行列であればCBlasRowMajorを指定 CblasNoTrans, //Aについて転置しない場合 CblasNoTrans 転置する場合 CblasTrans 2, //Aの行数(転置する場合は転置後の) 3, //Aの列数(転置する場合は転置後の) 1, //alphaの値 A, //A 3, //leading dimension(通常はAの列数) x, //x 1, //incx xのインクリメント幅(通常は1) 0, //betaの値 y, //y 1 //incx yのインクリメント幅(通常は1) ); for(j=0;j<2;j++){ printf("%f ",y[j]); } printf("\n"); return 0; }Fortranを直呼びする場合
#include <cblas.h> #include <stdio.h> int main(void) { int i,j; double *A; double *x,*y; int m=3,n=3;int ONE=1; double alpha=1,beta=2; A=(double*)malloc(3 * 3 * sizeof(double)); x=(double*)malloc( 3 * sizeof(double)); y=(double*)malloc( 3 * sizeof(double)); A[0]=1; A[3]=2; A[6]=3; A[1]=0; A[4]=2; A[7]=3; A[2]=0; A[5]=0; A[8]=3; x[0]=1; y[0]=1; x[1]=1; y[1]=1; x[2]=1; y[2]=1; dgemv_("N",&m,&n,&alpha,A,&m,x,&ONE,&beta,y,&ONE); for(j=0;j<n;j++){ printf("%f ",y[j]); } printf("\n"); return 0; }複素数の例
#include <cblas.h> #include <stdio.h> typedef struct { double r; double i; } complex_; int main(void) { //複素数を構造体無しで扱う場合はaxpyを参照 complex_ A[2][2]={{{1.0,2.0},{3.0,4.0}}, // 1+2i 3+4i {{5.0,6.0},{7.0,8.0}}}; // 5+6i 7+8i complex_ x[2] = {{3.0,4.0},{6.0,8.0}}; //(3+4i 6+8i) complex_ y[2]; //(19+58i -31+142i)となることを確かめる complex_ alpha={1,0}; complex_ beta={0,0}; int i,j; cblas_zgemv(CblasRowMajor,//通常のCの行列であればCBlasRowMajorを指定 CblasNoTrans, //Aを転置しない場合 CblasNoTrans 転置 CblasTrans 共役転置 CblasConjTrans 2, //Aの行数(転置する場合は転置後の) 2, //Aの列数(転置する場合は転置後の) &alpha, //alphaの値(構造体へのポインタで指定) A, //A 2, //leading dimension(通常はAの列数) x, //x 1, //incx xのインクリメント幅(通常は1) &beta, //betaの値(構造体へのポインタで指定) y, //y 1 //incx yのインクリメント幅(通常は1) ); for(j=0;j<2;j++){ printf("%lf %lf i, ",y[j].r,y[j].i); } printf("\n"); return 0; }
引数/戻り値
cblas_dgemv
変数名 | 型 | 上書き | 概要 |
order | enum CBLAS_ORDER | C言語では通常はCBlasRowMajor(列方向に並べる) Fortran式ならCBlasColMajor(行方向に並べる) | |
trans | enum CBLAS_TRANSPOSE | 行列の転置を指定 転置しない CblasNoTrans 転置 CblasTrans 共役転置 CblasConjTrans | |
m | int | 行列の行数 | |
n | int | 行列の列数 | |
alpha | double | スカラーalpha | |
A | double* | 行列Aの先頭ポインタ | |
ldA | int | Aのleading dimension CBlasRowMajorを指定したら列数 CBlasColMajor指定なら行数 | |
x | double* | ベクトルxの先頭ポインタ | |
incx | int | Xのインクリメント幅(通常1を指定すれば良い) | |
beta | double | スカラーbeta | |
y | double* | 上書き | ベクトルYの先頭ポインタ |
incy | int* | Yのインクリメント幅(通常1を指定すれば良い) | |
戻り値 | void |
dgemv_
変数名 | 型 | 概要 |
trans | char* | 行列の転置を指定 ("N"(そのまま),"T"(転置),"C"(共役転置)から選択) |
m | int* | 行列の行数 |
n | int* | 行列の列数 |
alpha | double* | スカラーalpha |
A | double* | 行列Aの先頭ポインタ |
ldA | int* | Aのleading dimension (通常は行数を指定すれば良い) |
x | double* | ベクトルxの先頭ポインタ |
incx | int* | Xのインクリメント幅(通常1を指定すれば良い) |
beta | double* | スカラーbeta |
y | double* | ベクトルYの先頭ポインタ |
incy | int* | Yのインクリメント幅(通常1を指定すれば良い) |
戻り値 | void |
プロトタイプ宣言
void sgemv_(char *trans, int *m, int *n,float *alpha, float *A, int *ldA, float *x, int *incx,
float *beta , float *y, int *incy);
void dgemv_(char *trans, int *m, int *n,
double *alpha, double *A, int *ldA, double *x, int *incx,
double *beta , double *y, int *incy);
void cgemv_(char *trans, int *m, int *n,
complex *alpha, complex *A, int *ldA, complex *x, int *incx,
complex *beta , complex *y, int *incy);
void zgemv_(char *trans, int *m, int *n,
doublecomplex *alpha, doublecomplex *A, int *ldA, doublecomplex *x, int *incx,
doublecomplex *beta , doublecomplex *y, int *incy);
void cblas_sgemv(const enum CBLAS_ORDER order, const enum CBLAS_TRANSPOSE trans, const blasint m, const blasint n,
const float alpha, const float *a, const blasint lda, const float *x, const blasint incx,
const float beta, float *y, const blasint incy);
void cblas_dgemv(const enum CBLAS_ORDER order, const enum CBLAS_TRANSPOSE trans, const blasint m, const blasint n,
const double alpha, const double *a, const blasint lda, const double *x, const blasint incx,
const double beta, double *y, const blasint incy);
void cblas_cgemv(const enum CBLAS_ORDER order, const enum CBLAS_TRANSPOSE trans, const blasint m, const blasint n,
const void *alpha, const void *a, const blasint lda, const void *x, const blasint incx,
const void *beta, void *y, const blasint incy);
void cblas_zgemv(const enum CBLAS_ORDER order, const enum CBLAS_TRANSPOSE trans, const blasint m, const blasint n,
const void *alpha, const void *a, const blasint lda, const void *x, const blasint incx,
const void *beta, void *y, const blasint incy);