added matrix_t and basic matrix functions

pull/2/head
Dsplib 2018-09-27 00:05:39 +03:00
rodzic 997fe0d8e7
commit 1bdc307d5f
10 zmienionych plików z 410 dodań i 60 usunięć

Wyświetl plik

@ -78,19 +78,6 @@ $extrastylesheet
<div id="dsplib_maket">
<div id="dsplib_right">
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- right -->
<ins class="adsbygoogle"
style="display:inline-block;width:160px;height:600px"
data-ad-client="ca-pub-6804616542664514"
data-ad-slot="1279323001"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</div>
<div id="dsplib_content">

Wyświetl plik

@ -1,74 +1,74 @@
/*!
\defgroup MAIN_GROUP Библиотека DSPL
\defgroup MAIN_GROUP Библиотека DSPL
\defgroup GETTING_START Быстрый старт использования библиотеки DSPL
\ingroup MAIN_GROUP
\defgroup TYPES_GROUP Типы данных DSPL
\ingroup MAIN_GROUP
В данной группе описаны типы данных библиотеки DSPL и методы их преобразования.
\defgroup TYPES_GROUP Типы данных DSPL
\ingroup MAIN_GROUP
В данной группе описаны типы данных библиотеки DSPL и методы их преобразования.
\defgroup SPECTRAL_GROUP Спектральный анализ
\ingroup MAIN_GROUP
\ingroup MAIN_GROUP
В данной группе собраны функции реализующие алгоритмы дискретного преобразования Фурье (ДПФ),
быстрого преобразования Фурье (БПФ), функции оконного взвешивания, расчета спектральной плотности мощности.
быстрого преобразования Фурье (БПФ), функции оконного взвешивания, расчета спектральной плотности мощности.
\defgroup DFT_GROUP Алгоритмы дискретного и быстрого преобразования Фурье
\ingroup SPECTRAL_GROUP
Алгоритмы дискретного и быстрого преобразования Фурье.
\defgroup WIN_GROUP Функции оконного взвешивания
\ingroup SPECTRAL_GROUP
\ingroup SPECTRAL_GROUP
\defgroup HILBERT_GROUP Преобразование Гильберта
\ingroup MAIN_GROUP
В данной группе собраны функции реализующие алгоритмы преобразования Гильберта.
В данной группе собраны функции реализующие алгоритмы преобразования Гильберта.
\defgroup FILTER_GROUP Цифровая фильтрация. Синтез и анализ цифровых фильтров.
\ingroup MAIN_GROUP
\defgroup FILTER_CONV_GROUP Свертка и цифровая фильтрация
\ingroup FILTER_GROUP
Функции для расчета циклической и линейной сверток, а также цифровой КИХ и БИХ фильтрации.
Функции для расчета циклической и линейной сверток, а также цифровой КИХ и БИХ фильтрации.
\defgroup IIR_FILTER_DESIGN_GROUP Расчет БИХ-фильтров
\ingroup FILTER_GROUP
Функции расчета цифровых БИХ-фильтров.
\ingroup FILTER_GROUP
Функции расчета цифровых БИХ-фильтров.
\defgroup FIR_FILTER_DESIGN_GROUP Расчет КИХ-фильтров
\ingroup FILTER_GROUP
\ingroup FILTER_GROUP
Функции расчета цифровых КИХ-фильтров.
\defgroup FILTER_ANALYSIS_GROUP Функции анализа аналоговых и цифровых фильтров
\ingroup FILTER_GROUP
\ingroup FILTER_GROUP
Функции анализа аналоговых и цифровых фильтров
\defgroup RESAMPLING_GROUP Цифровая передискретизация сигналов
\ingroup MAIN_GROUP
\defgroup SPEC_MATH_GROUP Специальные математические функции
\ingroup MAIN_GROUP
\defgroup SPEC_MATH_COMMON_GROUP Базовые математические функции.
\ingroup SPEC_MATH_GROUP
\defgroup SPEC_MATH_TRIG_GROUP Тригонометрические и гиперболические функции
\defgroup SPEC_MATH_TRIG_GROUP Тригонометрические и гиперболические функции
вещественного и комплексного аргумента.
\ingroup SPEC_MATH_GROUP
\defgroup SPEC_MATH_ELLIP_GROUP Эллиптические функции вещественного и комплексного аргумента.
\ingroup SPEC_MATH_GROUP
@ -77,19 +77,22 @@
\defgroup SPEC_MATH_STAT_GROUP Функции математической статистики
\ingroup SPEC_MATH_GROUP
\defgroup SPEC_MATH_LINALG_GROUP Линейная алгебра и матричные операции
\ingroup SPEC_MATH_GROUP
\defgroup IN_OUT_GROUP Функции ввода - вывода данных
\ingroup MAIN_GROUP
Функции ввода и вывода данных. Запись и считывание данных в бинарные и текстовые файлы.
\defgroup MACRO_DEFINE_GROUP Макросы и константы
\ingroup MAIN_GROUP
\defgroup ERROR_CODE_GROUP Коды ошибок при вызове функций
\ingroup MACRO_DEFINE_GROUP
В данной группе приведены возможные коды ошибок, возвращаемые функциями библиотеки в процессе
работы.
\ingroup MACRO_DEFINE_GROUP
В данной группе приведены возможные коды ошибок, возвращаемые функциями библиотеки в процессе
работы.
*/

Wyświetl plik

@ -0,0 +1,115 @@
/*! ****************************************************************************
\ingroup SPEC_MATH_LINALG_GROUP
\struct matrix_t
\brief Структура данных объекта матриц и векторов
Структура описывает вещественные и комплексные матрицы и векторы.
\param dat Указатель на область памяти, которая
хранит матрицу или вектор <BR><BR>
\param n Количество строк матрицы. <BR><BR>
\param m Количество столбцов матрицы. <BR><BR>
\param type Тип матрицы. <BR><BR>
Параметр `dat` преставляет собой указатель типа `void*` ввиду того, что матрица
может содержать как вещественные, так и комплексные значения. Если матрица
вещественная, то перед обращением к элементам матрицы необходимо указатель
`dat` привести к типу `double*`. Аналогично, указатель `dat` необходимо привести
к типу `complex_t*`, если матрица комплексная.
Матрицу заданного размера и типа можно создать функцией \ref matrix_create.
Например
\code
matrix_t a, b; // объявляем объекты матриц
// обнуляем все поля и указатели.
// Данные шаг рекомендуется ввиду того, что некоторые компиляторы
// при создании переменной не инициализируют ее нулем.
memset(&a, 0, sizeof(matrix_t));
memset(&b, 0, sizeof(matrix_t));
//создаем вещественную матрицу a размерности [3 x 4]
err = matrix_create(&a, 3, 4, DAT_DOUBLE);
// создаем комплексную матрицу b размерности [3 x 2]
err = matrix_create(&b, 3, 2, DAT_COMPLEX);
// ....
// работа с матрицами a и b
// ....
//очистить память перед выходом
matrix_free(&a);
matrix_free(&b);
\endcode
Двумереные матрицы размером `n` на `m` расположены в памяти в виде линейного
вектора, который организован по строкам. Так некий элемент матрицы \f$a_{ij}\f$
матрицы размерности `n` на `m` будет иметь индекс `j*n+i` (индексация матриц
начинается с нуля). Например:
\code
matrix_t a; // объявляем объекты матриц
// обнуляем все поля и указатели.
// Данные шаг рекомендуется ввиду того, что некоторые компиляторы
// при создании переменной не инициализируют ее нулем.
memset(&a, 0, sizeof(matrix_t));
// создаем вещественную матрицу a размерности [3 x 4]
err = matrix_create(&a, 3, 4, DAT_DOUBLE);
// приводим указатель к double*
double* x = (double*)(a.dat);
// присваиваем элемент a[2,3] = 3.0
x[3 * a.n + 2] = 3.0;
//очистить память перед выходом
matrix_free(&a);
\endcode
Если требуется изменить размер матрицы, то можно повторно вызывать функцию
\ref matrix_create. Например:
\code
matrix_t a; // объявляем объекты матриц
// обнуляем все поля и указатели.
// Данные шаг рекомендуется ввиду того, что некоторые компиляторы
// при создании переменной не инициализируют ее нулем.
memset(&a, 0, sizeof(matrix_t));
// создаем вещественную матрицу a размерности [3 x 4]
err = matrix_create(&a, 3, 4, DAT_DOUBLE);
// .....
// изменяем размер матрицы а на [6 x 7]
err = matrix_create(&a, 6, 7, DAT_DOUBLE);
// очистить память перед выходом
matrix_free(&a);
\endcode
\author
Бахурин Сергей.
www.dsplib.org
***************************************************************************** */

Wyświetl plik

@ -17,7 +17,7 @@
* You should have received a copy of the GNU Lesser General Public License
* along with Foobar. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dspl.h"
@ -30,8 +30,9 @@ void transpose_hermite(complex_t* a, int n, int m, complex_t* b);
/*******************************************************************************
Real matrx transpose
matrix_create
*******************************************************************************/
int DSPL_API matrix_create(matrix_t* a, int n, int m, int type)
{
@ -65,6 +66,123 @@ int DSPL_API matrix_create(matrix_t* a, int n, int m, int type)
/*******************************************************************************
matrix_free
*******************************************************************************/
void DSPL_API matrix_free(matrix_t* a)
{
if(!a)
return;
if(a->dat)
free(a->dat);
a->n = a->m = a->type = 0;
}
/*******************************************************************************
matrix transposition
*******************************************************************************/
int DSPL_API matrix_print(matrix_t* a, const char* name, const char* format)
{
int n,m;
if(!a)
return ERROR_PTR;
if(!a->dat)
return ERROR_PTR;
if((a->type & DAT_MASK) == DAT_DOUBLE)
{
printf("\nMatrix %s size [%d x %d] type: real\n",
name, a->n, a->m);
double* p = (double*)(a->dat);
for(n = 0; n < a->n; n++)
{
for(m = 0; m < a->m; m++)
{
printf(format, p[m*a->n + n]);
}
printf("\n");
}
}
if((a->type & DAT_MASK) == DAT_COMPLEX)
{
printf("\nMatrix %s size [%d x %d] type: complex\n",
name, a->n, a->m);
complex_t* p = (complex_t*)(a->dat);
for(n = 0; n < a->n; n++)
{
for(m = 0; m < a->m; m++)
{
printf(format, RE(p[m*a->n + n]),
IM(p[m*a->n + n]));
}
printf("\n");
}
}
return RES_OK;
}
/*******************************************************************************
matrix transposition
*******************************************************************************/
int DSPL_API matrix_transpose(matrix_t* a, matrix_t* b)
{
int err;
if(!a || !b)
return ERROR_PTR;
err = matrix_create(b, a->m, a->n, a->type);
if(err != RES_OK)
return err;
if((a->type & DAT_MASK) == DAT_DOUBLE)
transpose((double*)(a->dat), a->n, a->m, (double*)(b->dat));
if((a->type & DAT_MASK) == DAT_COMPLEX)
transpose_cmplx((complex_t*)(a->dat), a->n, a->m,
(complex_t*)(b->dat));
return RES_OK;
}
/*******************************************************************************
matrix Hermite transposition
*******************************************************************************/
int DSPL_API matrix_transpose_hermite(matrix_t* a, matrix_t* b)
{
int err;
if(!a || !b)
return ERROR_PTR;
err = matrix_create(b, a->m, a->n, a->type);
if(err != RES_OK)
return err;
if((a->type & DAT_MASK) == DAT_DOUBLE)
transpose((double*)(a->dat), a->n, a->m, (double*)(b->dat));
if((a->type & DAT_MASK) == DAT_COMPLEX)
transpose_hermite((complex_t*)(a->dat), a->n, a->m,
(complex_t*)(b->dat));
return RES_OK;
}
@ -105,6 +223,7 @@ void transpose(double* a, int n, int m, double* b)
/*******************************************************************************
Complex matrx transpose
*******************************************************************************/
@ -150,6 +269,7 @@ void transpose_cmplx(complex_t* a, int n, int m, complex_t* b)
/*******************************************************************************
Hermite matrx transpose
*******************************************************************************/
@ -178,7 +298,7 @@ void transpose_hermite(complex_t* a, int n, int m, complex_t* b)
for(j = 0; j < m; j++)
{
RE(b[i*m + j]) = RE(a[j*n+i]);
IM(b[i*m + j]) = IM(a[j*n+i]);
IM(b[i*m + j]) = -IM(a[j*n+i]);
}
}

Wyświetl plik

@ -98,6 +98,10 @@ p_low2bp low2bp ;
p_low2high low2high ;
p_low2low low2low ;
p_matrix_create matrix_create ;
p_matrix_free matrix_free ;
p_matrix_print matrix_print ;
p_matrix_transpose matrix_transpose ;
p_matrix_transpose_hermite matrix_transpose_hermite ;
p_poly_z2a_cmplx poly_z2a_cmplx ;
p_polyval polyval ;
p_polyval_cmplx polyval_cmplx ;
@ -231,6 +235,10 @@ void* dspl_load()
LOAD_FUNC(low2high);
LOAD_FUNC(low2low);
LOAD_FUNC(matrix_create);
LOAD_FUNC(matrix_free);
LOAD_FUNC(matrix_print);
LOAD_FUNC(matrix_transpose);
LOAD_FUNC(matrix_transpose_hermite);
LOAD_FUNC(poly_z2a_cmplx);
LOAD_FUNC(polyval);
LOAD_FUNC(polyval_cmplx);

Wyświetl plik

@ -560,6 +560,19 @@ DECLARE_FUNC(int, matrix_create, matrix_t* a
COMMA int n
COMMA int m
COMMA int type);
//------------------------------------------------------------------------------
DECLARE_FUNC(void, matrix_free, matrix_t* a);
//------------------------------------------------------------------------------
DECLARE_FUNC(int, matrix_print, matrix_t* a
COMMA const char* name
COMMA const char* format);
//------------------------------------------------------------------------------
DECLARE_FUNC(int, matrix_transpose, matrix_t* a
COMMA matrix_t* b);
//------------------------------------------------------------------------------
DECLARE_FUNC(int, matrix_transpose_hermite, matrix_t* a
COMMA matrix_t* b);
//------------------------------------------------------------------------------
DECLARE_FUNC(int, poly_z2a_cmplx, complex_t*
COMMA int

Wyświetl plik

@ -98,6 +98,10 @@ p_low2bp low2bp ;
p_low2high low2high ;
p_low2low low2low ;
p_matrix_create matrix_create ;
p_matrix_free matrix_free ;
p_matrix_print matrix_print ;
p_matrix_transpose matrix_transpose ;
p_matrix_transpose_hermite matrix_transpose_hermite ;
p_poly_z2a_cmplx poly_z2a_cmplx ;
p_polyval polyval ;
p_polyval_cmplx polyval_cmplx ;
@ -231,6 +235,10 @@ void* dspl_load()
LOAD_FUNC(low2high);
LOAD_FUNC(low2low);
LOAD_FUNC(matrix_create);
LOAD_FUNC(matrix_free);
LOAD_FUNC(matrix_print);
LOAD_FUNC(matrix_transpose);
LOAD_FUNC(matrix_transpose_hermite);
LOAD_FUNC(poly_z2a_cmplx);
LOAD_FUNC(polyval);
LOAD_FUNC(polyval_cmplx);

Wyświetl plik

@ -560,6 +560,19 @@ DECLARE_FUNC(int, matrix_create, matrix_t* a
COMMA int n
COMMA int m
COMMA int type);
//------------------------------------------------------------------------------
DECLARE_FUNC(void, matrix_free, matrix_t* a);
//------------------------------------------------------------------------------
DECLARE_FUNC(int, matrix_print, matrix_t* a
COMMA const char* name
COMMA const char* format);
//------------------------------------------------------------------------------
DECLARE_FUNC(int, matrix_transpose, matrix_t* a
COMMA matrix_t* b);
//------------------------------------------------------------------------------
DECLARE_FUNC(int, matrix_transpose_hermite, matrix_t* a
COMMA matrix_t* b);
//------------------------------------------------------------------------------
DECLARE_FUNC(int, poly_z2a_cmplx, complex_t*
COMMA int

Wyświetl plik

@ -0,0 +1,33 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dspl.h"
int main()
{
void* handle; // DSPL handle
handle = dspl_load(); // Load DSPL function
matrix_t r, c;
memset(&r, 0, sizeof(matrix_t));
memset(&c, 0, sizeof(matrix_t));
matrix_create(&r, 4, 3, DAT_DOUBLE);
linspace(0, 12, 12, DSPL_PERIODIC, (double*)r.dat);
matrix_print(&r, "R", "%8.2f");
matrix_create(&c, 2, 3, DAT_COMPLEX);
linspace(0, 12, 12, DSPL_PERIODIC, (double*)c.dat);
matrix_print(&c, "C", "%8.2f%+8.2fj ");
matrix_free(&r);
matrix_free(&c);
dspl_free(handle); // free dspl handle
// выполнить скрипт GNUPLOT для построения графиков
// по рассчитанным данным
return system("gnuplot gnuplot/sinc_test.plt");;
}

Wyświetl plik

@ -0,0 +1,50 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dspl.h"
int main()
{
void* handle; // DSPL handle
handle = dspl_load(); // Load DSPL function
matrix_t a, b, c;
memset(&a, 0, sizeof(matrix_t));
memset(&b, 0, sizeof(matrix_t));
memset(&c, 0, sizeof(matrix_t));
matrix_create(&a, 4, 3, DAT_DOUBLE);
linspace(0, 12, 12, DSPL_PERIODIC, (double*)a.dat);
matrix_print(&a, "A", "%8.2f");
matrix_transpose(&a, &b);
matrix_print(&b, "B=A^T", "%8.2f");
matrix_transpose_hermite(&a, &b);
matrix_print(&b, "B=A^H", "%8.2f");
matrix_create(&c, 2, 3, DAT_COMPLEX);
linspace(0, 12, 12, DSPL_PERIODIC, (double*)c.dat);
matrix_print(&c, "C", "%8.2f%+8.2fj ");
matrix_transpose(&c, &b);
matrix_print(&b, "B=C^T", "%8.2f%+8.2fj ");
matrix_transpose_hermite(&c, &b);
matrix_print(&b, "B=C^H", "%8.2f%+8.2fj ");
matrix_free(&a);
matrix_free(&b);
matrix_free(&c);
dspl_free(handle); // free dspl handle
// выполнить скрипт GNUPLOT для построения графиков
// по рассчитанным данным
return system("gnuplot gnuplot/sinc_test.plt");;
}