1) Умножение вектора на число "x=a*x":
dscal(n, a, x, inc)
n – количество элементов вектора умноженных на число a;
a – скаляр;
x – вектор;
inc – смещение между умножаемыми на константу элементами вектора;
Пример:
int n = 4;
int inc = 1;
double a = 2.0;
double x[4] = {1.0, 2.0, 3.0, 4.0};
dscal(&n, &a, x, &inc);
for(int i=0;i<n;i++)
printf(”x[%d] = %.1lf\n”,i,x[i]);
_____________________________________________________
x[0] = 2.0
x[1] = 4.0
x[2] = 6.0
x[3] = 8.0
2) Сложение векторов с умножением на константу "y=a*x+y":
daxpy(n, a, x, incx, y, incy)
n – количество элементов векторов x и y умноженных на число;
a – скаляр;
x – вектор;
incx – смещение между умножаемыми элементами вектора x;
y – вектор;
incy – смещение между умножаемыми элементами вектора.
Пример:
int n = 4;
int incx = 1;
int incy = 1;
double a = 2.0;
double x[4] = {1.0, 2.0, 3.0, 4.0};
double y[4] = {1.0, 1.0, 1.0, 1.0};
daxpy(&n, &a, x, &incx, y, &incy);
for(int i=0;i<n;i++)
printf(”y[%d] = %.1lf\n”,i,y[i]);
_____________________________________________________
y[0] = 3.0
y[1] = 5.0
y[2] = 7.0
y[3] = 9.0
3) Копирование векторов "x=y":
dcopy(n, x, incx, y, incy)
n – количество элементов векторов x и y;
x – вектор источник;
incx – смещение между элементами вектора x;
y – вектор приёмник;
incy – смещение между элементами вектора y;
Пример:
int n = 4;
int incx = 1;
int incy = 1;
double x[4] = {1.0, 2.0, 3.0, 4.0};
double y[4] = {1.0, 1.0, 1.0, 1.0};
dcopy(&n, x, &incx, y, &incy);
for(int i=0;i<n;i++)
printf(”y[%d] = %.1lf\n”,i,y[i]);
_____________________________________________________
y[0] = 1.0
y[1] = 2.0
y[2] = 3.0
y[3] = 4.0
4) Cкалярное произведение "(x,y)":
ddot(n, x, incx, y, incy)
n – количество элементов векторов x и y;
x – вектор;
incx – смещение между умножаемыми элементами вектора x;
y – вектор;
incy – смещение между умножаемыми элементами вектора y;
Пример:
int n = 4;
int incx = 1;
int incy = 1;
double res;
double x[4] = {1.0, 2.0, 3.0, 4.0};
double y[4] = {1.0, 1.0, 1.0, 1.0};
res = ddot(&n, x, &incx, y, &incy);
printf(”res = %.1lf\n”,res);
_____________________________________________________
res = 10.0
5) Вычисление эвклидовой нормы вектора ||x||:
dnrm2(n, x, incx)
n – количество элементов вектора x;
x – вектор;
incx – смещение между умножаемыми элементами вектора x;
Пример:
int n = 4;
int incx = 1;
double res;
double x[4] = {0.0, 4.0, 3.0, 0.0};
res = dnrm2(&n, x, &incx);
printf(”res = %.1lf\n”,res);
_____________________________________________________
res = 5.0
6) Умножение разреженной матрицы на вектор "y=Ax":
mkl_dcsrgemv(transa, m, values, ptr, columns, x, y)
transa – транспонирование матрицы;
m – размер матрицы A;
values – массив ненулевых элементов матрицы A;
ptr – массив указателей на начало строк;
columns – массив с номерами столбцов ненулевых элементов;
x – вектор, на который умножается матрица A;
y – вектор результат
Пример:
double values[7] = {2.0, 1.0, 1.0, 1.0, 1.0, 2.0, 2.0};
int columns[7] = {1, 3, 2, 4, 2, 3, 4};
int pointer[5] = {1, 3, 5, 7, 8};
double x[4] = {1.0, 2.0, 3.0, 4.0};
double y[4] = {0.0, 0.0, 0.0, 0.0};
char transa = 'n';
int m = 4, i;
mkl_dcsrgemv(&transa, &m, values, pointer, columns, x, y);
for(i=0;i<4;i++)
printf("%lf\n",y[i]);
_____________________________________________________
5.000000
6.000000
8.000000
8.000000