Этот пример показывает, как реализовать аппаратно-эффективное Q-less QR-разложение с помощью блока Complex Partial-Systolic Q-less QR Decomposition.
Блок Комплексного Частичного-Systolic Q-less QR Разложения выполняет первый шаг решения матричного уравнения A 'AX = B, которое преобразует A на месте в верхнетреугольную R, затем решает преобразованную систему R' RX = B, где R 'R = A' A
Задайте количество строк и столбцов в матрице А.
m = 5; % Number of rows in matrix A n = 3; % Number of columns in matrix A
Используйте функцию helper complexUniformRandomArray
сгенерировать случайную матрицу А таким образом, чтобы действительная и мнимая части элементов массива находились между -1 и + 1, а A является полным рангом.
rng('default')
A = fixed.example.complexUniformRandomArray(-1,1,m,n);
Используйте функцию helper qlessqrFixedpointTypes
для выбора типов данных с фиксированной точкой для матрицы А, которые гарантируют отсутствие переполнения при преобразовании A на месте в R. Для получения дополнительной информации о том, как выбираются типы данных, см. документ FixedPointMatrixLibraryDatatypesExample.pdf в текущей директории.
Действительная и мнимая части элементов массива находятся между -1 и 1, поэтому максимально возможным абсолютным значением любого элемента является sqrt (2).
max_abs_A = sqrt(2); % max(abs(A(:)) f = 24; % Fraction length (bits of precision) T = fixed.example.qlessqrFixedpointTypes(m,max_abs_A,f); A = cast(A,'like',T.A);
model = 'ComplexPartialSystolicQlessQRModel';
open_system(model);
Подсистема Обработчика Данных в этой модели принимает за вход сложную матрицу А The ready
порт запускает обработчик данных. После отправки истинного validIn
сигнал, может быть некоторая задержка перед ready
задано значение false. Когда Обработчик данных обнаруживает переднее ребро ready
сигнал, блок устанавливает validIn
в true и отправляет следующую строку A. Этот протокол позволяет отправлять данные всякий раз, когда переднее ребро ready
обнаруживается сигнал, обеспечивающий обработку всех данных.
Используйте функцию helper setModelWorkspace
чтобы добавить переменные, определенные выше, в рабочее пространство модели. Эти переменные соответствуют параметрам блоков для Комплексного Partial-Systolic Q-less блока QR-Декомпозиции.
numSamples = 1; % Number of sample matrices fixed.example.setModelWorkspace(model,'A',A,'m',m,'n',n,... 'numSamples',numSamples);
out = sim(model);
Блок Комплексного Частичного-Систематического QR-Разложения выводит матрицу R на каждом временном шаге. Когда выводится допустимая матрица результатов, блок устанавливает validOut
к true.
R = out.R;
R является верхней треугольной матрицей.
R
R = 2.1863 + 0.0000i 0.6427 - 1.0882i -0.5771 - 0.3089i 0.0000 + 0.0000i 1.8126 + 0.0000i 0.2095 + 0.0599i 0.0000 + 0.0000i 0.0000 + 0.0000i 1.7760 + 0.0000i DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 28 FractionLength: 24
isequal(R,triu(R))
ans = logical 1
Чтобы оценить точность Комплексного Partial-Systolic Q-less блока QR Decomposition, вычислите относительную погрешность.
relative_error = norm(double(R'*R - A'*A))/norm(double(A'*A))
relative_error = 8.4297e-07
Подавить предупреждения mlint.
%#ok<*NOPTS>