Реализуйте эффективный оборудованием комплексный пакет разложение QR

В этом примере показано, как реализовать эффективное оборудованием разложение QR с помощью блока Complex Burst QR Decomposition.

Размер экономики разложение QR

Блок Complex Burst QR Decomposition выполняет первый шаг решения матричного уравнения AX наименьших квадратов = B, который преобразовывает оперативное к R и B оперативный к C = Q'B, затем решает преобразованный системный RX = C, где QR является ортогонально-треугольным разложением A.

Чтобы вычислить автономное разложение QR, этот пример устанавливает B быть единичной матрицей так, чтобы выход блока Complex Burst 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

Сгенерируйте матрицы A и B

Используйте функцию помощника complexUniformRandomArray чтобы сгенерировать случайную матрицу А, таким образом, что действительные и мнимые части элементов массива между-1 и +1, и A является полным рангом. Матрица B является единичной матрицей.

rng('default')
A = fixed.example.complexUniformRandomArray(-1,1,m,n);
B = eye(m);

Выберите Fixed-Point Data Types

Используйте функцию помощника 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 = 'ComplexBurstQRModel';
open_system(model);

Подсистема Обработчика Данных в этой модели берет комплексные матрицы A и B как входные параметры. ready порт инициировал Обработчик Данных. После отправки истинного validIn сигнал, перед ready может быть некоторая задержка установлен в ложь. Когда Обработчик Данных обнаруживает передний край ready сигнал, блок устанавливает validIn к истине и отправляет следующую строку A и B. Этот протокол позволяет данным быть отправленными каждый раз, когда передний край ready сигнал обнаруживается, гарантируя, что все данные обрабатываются.

Установите переменные в рабочем пространстве модели

Используйте функцию помощника setModelWorkspace добавить переменные, заданные выше к рабочему пространству модели. Эти переменные соответствуют параметрам блоков для блока Complex Burst 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 Burst QR Decomposition выходные данные одна строка за один раз. Когда строка результата выводится, блок устанавливает validOut к истине. Строки матриц R и C выводятся в обратном порядке, чтобы вместить заднюю замену, таким образом, необходимо восстановить данные, чтобы интерпретировать результаты. Чтобы восстановить матрицы R и C от выходных данных, используйте функцию помощника qrModelOutputToArray.

[C,R] = fixed.example.qrModelOutputToArray(out.C,out.R,m,n,p,numSamples);

Извлеките размер экономики Q

Блок вычисляет C = Q'B. В этом примере B является единичной матрицей, таким образом, Q = C' является размером экономики ортогональный фактор разложения QR.

Q = C';

Проверьте, что Q является Ортогональным, и R является Верхней треугольной

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: 60
        FractionLength: 48

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 Burst QR Decomposition, вычислите относительную погрешность.

relative_error = norm(double(Q*R - A))/norm(double(A))
relative_error =

   1.7960e-06

Подавите mlint предупреждения.

%#ok<*NOPTS>