libdspl-2.0
Библиотека алгоритмов цифровой обработки сигналов
Линейная алгебра и матричные операции

В данном разделе описаны функции работы с матрицами и алгоритмы линейной алгебры. Вычислительными ядрами являются пакеты BLAS и LAPACK, функции которых вызываются через интерфейс DSPL-2.0.

Матрицы - двумерные объекты, которые хранятся в линейной памяти по столбцам и передаются в функции в виде указателя на линейную область памяти. Подробнее...

Функции

int matrix_eig_cmplx (complex_t *a, int n, complex_t *v, int *info)
 Расчет собственных значений квадратной комплексной матрицы. Подробнее...
 
int matrix_eye (double *a, int n, int m)
 Генерирование единичной вещественной матрицы размерности n x m. Подробнее...
 
int matrix_eye_cmplx (complex_t *a, int n, int m)
 Генерирование единичной комплексной матрицы размерности n x m. Подробнее...
 
int matrix_mul (double *a, int na, int ma, double *b, int nb, int mb, double *c)
 Произведение вещественных матриц. Подробнее...
 

Подробное описание

В данном разделе описаны функции работы с матрицами и алгоритмы линейной алгебры. Вычислительными ядрами являются пакеты BLAS и LAPACK, функции которых вызываются через интерфейс DSPL-2.0.

Матрицы - двумерные объекты, которые хранятся в линейной памяти по столбцам и передаются в функции в виде указателя на линейную область памяти.

Функции

◆ matrix_eig_cmplx()

int matrix_eig_cmplx ( complex_t a,
int  n,
complex_t v,
int *  info 
)

Расчет собственных значений квадратной комплексной матрицы.


Данная функция производит расчет n собственных значений квадратной матрицы размером n x n.

Аргументы
[in]aУказатель на комплексную матрицу размерности n x n.
Матрица должна быть расположена в памяти по столбцам.

[in]nРазмерность квадратной матрицы.
[out]vУказатель на вектор собственных значений матрицы.
Размер вектора n x 1.
Память должна быть выделена.

[out]infoУказатель на код возврата функции zgees пакета LAPACK.
В случае возникновения ошибки при расчете вектора собственных значений, пакет LAPACK возвращает код ошибки, который может быть прочитан по данному указателю.
Возвращает
RES_OK — функция выполнена успешно.
В противном случае код ошибки.
При возникновении ошибки ERROR_LAPACK по адресу
info будет записан код ошибки пакета LAPACK.

Пример расчета собственных значений матрицы:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dspl.h"
#define N 3
int main()
{
void* handle; /* DSPL handle */
handle = dspl_load(); /* Load DSPL function */
complex_t a[N*N] = {{1.0, 0.0}, {1.0, 0.0}, {0.0, 0.0},
{2.0, 0.0}, {0.0, 0.0}, {1.0, 0.0},
{3.0, 0.0}, {0.0, 0.0}, {0.0, 0.0}};
complex_t v[N];
int err, info;
matrix_print_cmplx(a, N, N, "A", "%8.2f%+8.2fi");
err = matrix_eig_cmplx(a, N, v, &info);
if(err!=RES_OK)
{
printf("ERROR CODE: 0x%.8x, info = %d\n", err, info);
}
matrix_print_cmplx(v, N, 1, "v", "%10.6f%+10.6fi");
dspl_free(handle); /* free dspl handle */
return 0;
}

Данная программа рассчитывает собственные значения матрицы размерности 3 x 3 и выводит собственные значения на печать.
Результат работы программы:

A = [ % size [3 x 3] type: complex
1.00   +0.00i,     2.00   +0.00i,     3.00   +0.00i;
1.00   +0.00i,     0.00   +0.00i,     0.00   +0.00i;
0.00   +0.00i,     1.00   +0.00i,     0.00   +0.00i;];

v = [ % size [3 x 1] type: complex
 2.374424 -0.000000i;    
-0.687212 +0.889497i;
-0.687212 -0.889497i;];
Автор
Бахурин Сергей www.dsplib.org

См. определение в файле matrix_eig_cmplx.c строка 141

Используется в polyroots().

◆ matrix_eye()

int matrix_eye ( double *  a,
int  n,
int  m 
)

Генерирование единичной вещественной матрицы размерности n x m.


Данная функция заполняет матрицу нулями и записывает единицы на главной диагонали

Аргументы
[in]aУказатель на вещественную матрицу размерности n x m.
Матрица должна быть расположена в памяти по столбцам.

[in]nКоличество строк матрицы.

[in]mКоличество столбцов матрицы.

Возвращает
RES_OK — функция выполнена успешно.
В противном случае код ошибки.
Автор
Бахурин Сергей www.dsplib.org

См. определение в файле matrix_eye.c строка 80

◆ matrix_eye_cmplx()

int matrix_eye_cmplx ( complex_t a,
int  n,
int  m 
)

Генерирование единичной комплексной матрицы размерности n x m.


Данная функция заполняет матрицу нулями и записывает единицы на главной диагонали

Аргументы
[in]aУказатель на комплексную матрицу размерности n x m.
Матрица должна быть расположена в памяти по столбцам.

[in]nКоличество строк матрицы.

[in]mКоличество столбцов матрицы.

Возвращает
RES_OK — функция выполнена успешно.
В противном случае код ошибки.
Автор
Бахурин Сергей www.dsplib.org

См. определение в файле matrix_eye_cmplx.c строка 81

◆ matrix_mul()

int matrix_mul ( double *  a,
int  na,
int  ma,
double *  b,
int  nb,
int  mb,
double *  c 
)

Произведение вещественных матриц.


Функция рассчитывает произведение матриц \(\mathbf{C} = \mathbf{AB}\), где \(\mathbf{A}\) – матрица размерности \(N_A\) строк и \(M_A\) столбцов, матрица размерности \(N_B\) строк и \(M_B\) столбцов, а результирующая матрица \(\mathbf{C} = \mathbf{AB}\) имеет размерность \(N_A\) строк и \(M_B\) столбцов.

Заметки
Для умножения матриц необходимо выполнение равенства \(M_A = N_B\).
Функция использует подпрограмму dgemm пакета BLAS.
Аргументы
[in]aУказатель на матрицу \(\mathbf{A}\) размерности na x ma.
Матрица должна быть расположена в памяти по столбцам.

[in]naКоличество строк матрицы a.

[in]maКоличество столбцов матрицы a.

[in]bУказатель на матрицу \(\mathbf{B}\) размерности nb x mb.
Матрица должна быть расположена в памяти по столбцам.

[in]nbКоличество строк матрицы b.
Необходимо выполнение равенства ma = nb.

[in]mbКоличество столбцов матрицы b.

[out]cУказатель на матрицу \(\mathbf{С} = \mathbf{AB}\).
Размер матрицы na x mb.
Память должна быть выделена.

Возвращает
RES_OK — функция выполнена успешно.
В противном случае код ошибки.
Пример умножения матриц:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dspl.h"
#define N 4
#define M 3
#define K 5
int main()
{
void* handle; /* DSPL handle */
handle = dspl_load(); /* Load DSPL function */
double a[N*K], b[K*M], c[N*M];
linspace(0, N*K, N*K, DSPL_PERIODIC, a);
matrix_print(a, N, K, "A", "%8.2f");
linspace(0, K*M, K*M, DSPL_PERIODIC, b);
matrix_print(b, K, M, "B", "%8.2f");
matrix_mul(a, N, K, b, K, M, c);
matrix_print(c, N, M, "C", "%8.2f");
dspl_free(handle); /* free dspl handle */
return 0;
}

Программа формирует и умножает две матрицы. Исходные матрицы и их произведение выводится на печать.

Результат работы программы:

A = [ % size [4 x 5] type: real
0.00,     4.00,     8.00,    12.00,    16.00;
1.00,     5.00,     9.00,    13.00,    17.00;
2.00,     6.00,    10.00,    14.00,    18.00;
3.00,     7.00,    11.00,    15.00,    19.00;];

B = [ % size [5 x 3] type: real
0.00,     5.00,    10.00;
1.00,     6.00,    11.00;
2.00,     7.00,    12.00;
3.00,     8.00,    13.00;
4.00,     9.00,    14.00;];

C = [ % size [4 x 3] type: real
120.00,   320.00,   520.00;
130.00,   355.00,   580.00;
140.00,   390.00,   640.00;
150.00,   425.00,   700.00;]; 
Автор
Бахурин Сергей www.dsplib.org

См. определение в файле matrix_mul.c строка 189

void * dspl_load()
Произвести динамическую линковку и загрузить функции libdspl-2.0.
int matrix_eig_cmplx(complex_t *a, int n, complex_t *v, int *info)
Расчет собственных значений квадратной комплексной матрицы.
double complex_t[2]
Описание комплексного типа данных.
Definition: dspl.h:86
void dspl_free(void *handle)
Очищает связанную ранее динамическую библиотеку DSPL-2.0.
#define RES_OK
Функция завершилась корректно. Ошибки отсутствуют.
Definition: dspl.h:558
int linspace(double x0, double x1, int n, int type, double *x)
Функция заполняет массив линейно-нарастающими, равноотстоящими значениями от x0 до x1
Definition: linspace.c:169
int matrix_mul(double *a, int na, int ma, double *b, int nb, int mb, double *c)
Произведение вещественных матриц.
Definition: matrix_mul.c:189