В этом примере показано, как реализовать эффективное оборудованием разложение QR с помощью блока Complex Partial-Systolic QR Decomposition.
Блок Complex Partial-Systolic QR Decomposition выполняет первый шаг решения матричного уравнения AX наименьших квадратов = B, который преобразовывает оперативное к R и B оперативный к C = Q'B, затем решает преобразованный системный RX = C, где QR является ортогонально-треугольным разложением A.
Чтобы вычислить автономное разложение QR, этот пример устанавливает B быть единичной матрицей так, чтобы выход блока Complex Partial-Systolic QR Decomposition был верхне-треугольным R и C = Q'.
Задайте количество строк в матрицах A и B, количество столбцов в матрице А и количество столбцов в матрице B. Этот пример устанавливает B быть единичной матрицей тот же размер как количество строк A.
m = 10; % Number of rows in matrices A and B n = 3; % Number of columns in matrix A p = m; % Number of columns in matrix B
Используйте функцию помощника complexUniformRandomArray
чтобы сгенерировать случайную матрицу А, таким образом, что действительные и мнимые части элементов массива между-1 и +1, и A является полным рангом. Матрица B является единичной матрицей.
rng('default')
A = fixed.example.complexUniformRandomArray(-1,1,m,n);
B = eye(m);
Используйте функцию помощника qrFixedpointTypes
чтобы выбрать типы данных с фиксированной точкой для входных матриц A и B, которые гарантируют, никакое переполнение не произойдет в преобразовании оперативного к R и B оперативный к C = Q'B.
Действительные и мнимые части элементов массива между-1 и 1, таким образом, максимальное возможное абсолютное значение любого элемента является sqrt (2).
max_abs_A = sqrt(2); % Upper bound on max(abs(A(:)) max_abs_B = 1; % Upper bound on max(abs(B(:)) precisionBits = 24; % Number of bits of precision T = fixed.qrFixedpointTypes(m,max_abs_A,max_abs_B,precisionBits); A = cast(A,'like',T.A); B = complex(cast(B,'like',T.B));
model = 'ComplexPartialSystolicQRModel';
open_system(model);
Подсистема Обработчика Данных в этой модели берет комплексные матрицы A и B как входные параметры. ready
порт инициировал Обработчик Данных. После отправки истинного validIn
сигнал, перед ready
может быть некоторая задержка установлен в ложь. Когда Обработчик Данных обнаруживает передний край
ready
сигнал, блок устанавливает validIn
к истине и отправляет следующую строку A и B. Этот протокол позволяет данным быть отправленными каждый раз, когда передний край ready
сигнал обнаруживается, гарантируя, что все данные обрабатываются.
Используйте функцию помощника setModelWorkspace
добавить переменные, заданные выше к рабочему пространству модели. Эти переменные соответствуют параметрам блоков для блока Complex Partial-Systolic QR Decomposition.
numSamples = 1; % Number of sample matrices fixed.example.setModelWorkspace(model,'A',A,'B',B,'m',m,'n',n,'p',p,... 'numSamples',numSamples);
out = sim(model);
Блок Complex Partial-Systolic QR Decomposition выходные матрицы R и C на каждом временном шаге. Когда допустимые матрицы результата выводятся, блок устанавливает validOut
к истине.
R = out.R; C = out.C;
Блок вычисляет C = Q'B. В этом примере B является единичной матрицей, таким образом, Q = C' является размером экономики ортогональный фактор разложения QR.
Q = C';
Q является orothogonal, таким образом, Q'Q является единичной матрицей в рамках округления.
I = Q'*Q
I = 1.0000 + 0.0000i -0.0000 - 0.0000i 0.0000 + 0.0000i -0.0000 + 0.0000i 1.0000 + 0.0000i -0.0000 + 0.0000i 0.0000 - 0.0000i -0.0000 - 0.0000i 1.0000 + 0.0000i DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 62 FractionLength: 50
R является верхней треугольной матрицей.
R
R = 3.1655 + 0.0000i 0.4870 + 1.1980i 0.1466 - 0.9092i 0.0000 + 0.0000i 2.2184 + 0.0000i -0.2159 - 0.0972i 0.0000 + 0.0000i 0.0000 + 0.0000i 2.2903 + 0.0000i DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 29 FractionLength: 24
isequal(R,triu(R))
ans = logical 1
Чтобы оценить точность блока Complex Partial-Systolic QR Decomposition, вычислите относительную погрешность.
relative_error = norm(double(Q*R - A))/norm(double(A))
relative_error = 8.3297e-07
Подавите mlint предупреждения.
%#ok<*NOPTS>