В этом примере показано, как HDL Coder™ реализует режим потоковой передачи матричной обратной операции с конфигурируемыми размерами.
Матрица X является обратимой, если существует матрица Y такого же размера, что XY = YX = I, где I является матрицей идентичности. Матрица Y называется обратной от X. Матрица, не имеющая обратной, является сингулярной. Квадратная матрица является сингулярной только тогда, когда её определитель точно равен нулю.
Обратное вычисление матрицы включает в себя следующие шаги:
Расчет матрицы кофакторов
Транспонирование матрицы кофактора
Умножить возвратно-поступательно определителя входной матрицы на транспонирование кофакторной матрицы
Пример:
A = [4 12 -16;12 37 -43;-16 -43 98];
Cofactors of 'A' will be calculated from matrix of minors
cof(A) = [1777 488 76;488 136 20;76 20 4];Transpose of cofactor matrix will be
(cof(A))' = [1777 488 76;488 136 20;76 20 4];Multiply reciprocal of determinant of 'A' with transpose of cofactor matrix
Ainv = (1/det(A)) * (cof(A))'
= [49.3611 -13.5556 2.1111;-13.5556 3.7778 -0.5556;2.1111 -0.5556 0.1111];Чтобы найти обратную матрицу A, используя исключение Гаусса-Джордана, мы должны найти элементарные операции строк, которые уменьшают A до единичной матрицы (I), а затем выполнить те же операции над единичной матрицей (I), чтобы получить Ainv.
Вычисление Matrix Inverse с использованием устранения Гаусса-Джордана: Позвольте начать с матрицы A, и запишите ее с матрицей Identity рядом с ней: [A | I]
Цель состоит в том, чтобы сделать A единичной матрицей путем применения преобразований строк и правой боковой матрицы I также участвовал в преобразованиях строк, наконец, уменьшенных до Ainv.
Вычисление Ainv включает в себя следующие этапы:
замена строк
сделать диагональные элементы 1
сделать недиагональные элементы равными 0
Пример:
(A) (I)
1 2 3 | 1 0 0
[A | I] = 2 5 3 | 0 1 0
1 0 8 | 0 0 1Find the element with maximum value in the first column and swap the current
row with maximum element row
swap R1 and R2 rows as R2 contains the largest values. 2 5 3 | 0 1 0
= 1 2 3 | 1 0 0
1 0 8 | 0 0 1Make the diagonal element in the first column as '1'
R1 --> R1/2 1 2.5 1.5 | 0 0.5 0
= 1 2 3 | 1 0 0
1 0 8 | 0 0 1
Make the non-diagonal elements in the first column as '0'
R2 --> R2 - R1
R3 --> R3 - R1 1 2.5 1.5 | 0 0.5 0
= 0 -0.5 1.5 | 1 -0.5 0
0 -2.5 6.5 | 0 -0.5 1Now column 1 has diagonal elements '1' and other elements as '0'. This procedure is repeated for remaining columns and matrix A will be reduced to identity matrix, Identity matrix will be reduced to Ainv.
1 0 0 | -40 16 9
= 0 1 0 | 13 -5 -3
0 0 1 | 5 -2 -1
(I) (Ainv)Matrix Inverse с помощью разложения холески поддерживает только симметричные положительные определенные матрицы. Положительное определенное означает, что все собственные значения матрицы должны быть положительными.
Учитывая симметричную положительную определенную матрицу A:
A = L * L', L is the lower triangular matrix
L' is the transpose of L inv(A) = inv(L * L')
= inv(L') * inv(L)
= (inv(L))' * inv(L) Ainv = Linv' * Linv, Linv is the inverse of lower triangular matrix
Ainv is the inverse of input matrixВычисление Ainv включает в себя следующие этапы:
Вычисление нижней треугольной матрицы (L)
Инверсия нижней треугольной матрицы (Linv)
Умножение транспонирования Linv на Linv
Пример:
A = [4 12 -16;12 37 -43;-16 -43 98];
Lower triangular matrix(L) will be computed using cholesky decomposition
L = [2 0 0;6 1 0;-8 5 3];Linv will be computed using forward substitution method
Linv = [0.5 0 0;-3 1 0;6.3333 -1.6667 0.3333];Multiply transpose of Linv with Linv
Ainv = Linv' * Linv
= [49.3611 -13.5556 2.1111;-13.5556 3.7778 -0.5556;2.1111 -0.5556 0.1111];Gauss-Jordan Elimination поддерживает все квадратные матрицы.
Ликвидация Гаусса-Джордана поддерживает оба single и double типы данных.
Матрицы, для которых вычисляется обратная, должны быть симметричными положительными-определенными.
Типы входных данных матриц должны быть single и блок должен использоваться в Native Floating Point режим.
Размер входных матриц не должен превышать 64 на 64.

Описание инверсных портов матрицы:


В данном примере модель содержит три подсистемы: InputSubsystem, MatrixInverse, и OutputSubsystem. InputSubsystem является восходящим модулем, который сериализует матричный ввод в модуль обработки, когда ready сигнал включен. OutputSubsystem является нисходящим модулем, который десериализует данные из модуля обработки в матричный вывод, когда outEnable сигнал включен. MatrixInverse - модуль обработки, реализующий обратную операцию матрицы.
open_system('hdlcoder_streaming_mat_inv_max_lat_cholesky'); open_system('hdlcoder_streaming_mat_inv_max_lat_gauss_jordan');


Временная диаграмма для всей системы:

Временная диаграмма для стадии обработки (разложение по Холескому):

Временная диаграмма для этапа обработки (устранение Гаусса-Джордана):

Форма сигнала результата Modelsim (разложение Холеского)

Форма сигнала результата Modelsim (исключение Гаусса-Джордана)


MatrixSize : Enter size of input matrix as a positive integer.
LatencyStrategy : Select latency strategy from drop down menu
({'ZERO, 'MIN', 'MAX'}) which should be same as HDL coder
latency strategy. User can see processing latency
based on the latency strategy.
AlgorithmType : Select algorithm type from drop down menu({'CholeskyDecomposition',
'GaussJordanElimination'})Установка параметров блока системы MATLAB.
Выберите входную матрицу на основе размера матрицы.
Создание кода HDL для подсистемы MatrixInverse.
После создания кода для подсистемы MatrixInverse генерируется код

Созданная модель содержит системный блок MatrixInverse MATLAB. При моделировании моделируемого кода выходные сигналы формирования сравниваются с выходными сигналами блока системы MATLAB.
Разложение Холеского

Ликвидация Гаусса-Джордана
