?AXPY_
List
saxpy_ | cblas_saxpy | 単精度実数ベクトル同士の加算 |
daxpy_ | cblas_daxpy | 倍精度実数ベクトル同士の加算 |
caxpy_ | cblas_caxpy | 単精度複素数ベクトル同士の加算 |
zaxpy_ | cblas_zaxpy | 倍精度複素数ベクトル同士の加算 |
概略
ベクトル同士の加算を行います。行列も大きさが非常に長いベクトルだと思えば使えます。与えたベクトルYの内容は破壊され、計算結果が書きこまれます。計算式
Y := alpha * X + Yサンプルコード
実数の例#include <cblas.h> #include <stdio.h> int main(void) { int i=0; double x[2] = {3.0,4.0}; double y[2] = {7.0,8.0}; double a = 2.0; cblas_daxpy(2, a, x, 1, y, 1); // 2*(3,4)+(7,8) for(i=0;i<2;i++){ printf("%lf ",y[i]); // (13,16) } printf("\n"); return 0; }FORTRAN版へリンクする場合
#include <cblas.h> #include <stdio.h> int main(void) { int i=0; double x[2] = {3.0,4.0}; double y[2] = {7.0,8.0}; double a = 2.0; int ONE = 1; int len = 2; daxpy_(&len,&a,x,&ONE,y,&ONE); for(i=0;i<2;i++){ printf("%lf ",y[i]); } printf("\n"); return 0; }
複素数の例
#include <cblas.h> #include <stdio.h> typedef struct { double r; double i; } complex_; int main(void) { int i=0; //複素数を構造体無しで扱う場合 double x[4] = {3.0,4.0,5.0,6.0};// x = (3+4i , 5+6i) double y[4] = {7.0,8.0,9.0,10.0}// y = (7+8i , 9+10i); double a[2] = {1.0,2.0}; // a = 1+2i cblas_zaxpy(2, a, x, 1, y, 1); //n=2で指定するので注意 for(i=0;i<4;i++) printf("%lf ",y[i]); //(2+18i , 2+26i) printf("\n"); //複素数を構造体で扱う場合 complex_ xx[2]={{3.0,4.0},{5.0,6.0}}; // x = (3+4i , 5+6i) complex_ yy[2]={{7.0,8.0},{9.0,10.0}}; // y = (7+8i , 9+10i) complex_ aa={1.0,2.0}; // a = 1+2i cblas_zaxpy(2,&aa,xx,1,yy,1); // ( (1+2i)*(3+4i) + 7+8i ,(1+2i)*(5+6i)+(9+10i) ) for(i=0; i<2; i++){ printf("%lf + %lfi ", yy[i].r,yy[i].i); //(2+18i , 2+26i) } printf("\n"); return 0; }
引数/戻り値
cblas_daxpy
変数名 | 型 | 上書き | 概要 |
n | int | ベクトルX,Yの大きさ(長さ) | |
alpha | double | Xベクトルのスカラ倍の係数 | |
X | double* | ベクトルXの先頭ポインタ | |
incX | int | Xのインクリメント幅(通常1を指定すれば良い) | |
Y | double* | 上書き | ベクトルYの先頭ポインタ |
incY | int | Yのインクリメント幅(通常1を指定すれば良い) | |
戻り値 | void |
daxpy_
変数名 | 型 | 概要 |
n | int* | ベクトルX,Yの大きさ(長さ) |
alpha | double* | Xベクトルのスカラ倍の係数 |
X | double* | ベクトルXの先頭ポインタ |
incX | int* | Xのインクリメント幅(通常1を指定すれば良い) |
Y | double* | ベクトルYの先頭ポインタ |
incY | int* | Yのインクリメント幅(通常1を指定すれば良い) |
戻り値 | void |
プロトタイプ宣言
void saxpy_(int *n, float *alpha, float *x, int *incx, float *y, int *incy);void daxpy_(int *n, double *alpha, double *x, int *incx, double *y, int *incy);
void caxpy_(int *n, complex *alpha, complex *x, int *incx, complex *y, int *incy);
void zaxpy_(int *n, doublecomplex *alpha, doublecomplex *x, int *incx, doublecomplex *y, int *incy);
void cblas_saxpy(const blasint n, const float alpha, const float *x, const blasint incx, float *y, const blasint incy);
void cblas_daxpy(const blasint n, const double alpha, const double *x, const blasint incx, double *y, const blasint incy);
void cblas_caxpy(const blasint n, const void *alpha, const void *x, const blasint incx, void *y, const blasint incy);
void cblas_zaxpy(const blasint n, const void *alpha, const void *x, const blasint incx, void *y, const blasint incy);
※OPENBLAS_CONSTはcblas.hにて
# define OPENBLAS_CONST constで定義されているため、ここではconstで置き換えている
※blasintはcommon.hにて
#if defined(OS_WINDOWS) && defined(__64BIT__) typedef long long BLASLONG; typedef unsigned long long BLASULONG; #else typedef long BLASLONG; typedef unsigned long BLASULONG; #endif #ifdef USE64BITINT typedef BLASLONG blasint; #else typedef int blasint; #endifで定義される(不要なコードは除いている)ため、環境により異なる。
初学者は通常はintの別名として定義されると考えて使用しても概ね差し支えない
(Cにおいてはintの値を渡しても自動的に昇格されるので)