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

Этот пример демонстрирует, как вычислить разложение QR комплексных матриц с помощью эффективного оборудованием кода MATLAB® в Simulink®. Эта модель совместно использует вычислительные ресурсы через шаги Алгоритма разложения QR. Это таким образом использует меньше на ресурсах чипа, чем полностью конвейерный подход при принесении в жертву некоторой общей пропускной способности.

Решение матричных уравнений с разложением QR

При решении матричных уравнений редко, если когда-либо, необходимо вычислить инверсию матрицы [1] [3]. Блок Complex Burst QR Decomposition предоставляет оборудованию эффективный способ решить уравнение

$$ Ax = B $$

где$A$ комплекс m x n матрица,$x$ является комплексом n x p матрица и$B$ является комплексом m x p матрица. Это уравнение может быть преобразовано в форму

$$ Rx = Q^H B $$

через ряд ортогональных преобразований. Здесь,$R$ комплекс m x n верхняя треугольная матрица.$Q$ комплекс m x m ортогональная матрица, таким образом что$QR = A$. Блок Complex Burst QR Decomposition сохраняет только ненулевые строки$R$, наряду с соответствующими строками$Q^H B$.

Разложение QR хорошо подходит для архитектур фиксированной точки, потому что оно может быть полностью выполнено с вращениями Givens. Они имеют эффективную реализацию фиксированной точки в терминах алгоритма CORDIC. Для получения дополнительной информации об алгоритме для фиксированной точки разложение QR смотрите, Выполняют QR-факторизацию Используя CORDIC.

Чтобы начаться, откройте модель Simulink fxpdemo_complex_burst_QR_model:

open_system('fxpdemo_complex_burst_QR_model');

Эта модель работает с фиксированной точкой, дважды, одним, и масштабируемыми двойными типами данных. Полностью конвейерная версия этого алгоритма реализована в Simulink. Смотрите Реализацию Эффективное Оборудованием Разложение QR Используя CORDIC в Систолическом Массиве.

Введите параметры для комплексного пакета разложение QR

Блок Complex Burst QR Decomposition берет четыре входных параметра. Маску для этого блока показывают ниже:

Необходимо присвоить входные данные переменным в рабочем пространстве MATLAB. Чтобы настроить этот алгоритм, измените данные согласно процедурам, используемым в следующих разделах.

Задайте матричные размерности

Архитектура модели выделяет минимальную память, необходимую, чтобы хранить данные, должен был выполнить разложение QR. Поэтому размер входных матриц должен быть известен во время компиляции. Здесь, m количество строк в комплексных матрицах A и BN количество столбцов в A, и p количество столбцов в B.

Кроме того, поскольку блок может обработать разложение неопределенного количества матриц последовательно, много выборок задан. Модель завершает работу, когда все выборки использовались.

m = 4;
n = 4;
p = 4;
num_samples = 100;

Входные Define типы данных

Прежде, чем сгенерировать входные данные, важно задать тип данных матричных данных как показано ниже. Этот пример использует подписанные фиксированные точки с 16-битными размерами слова и дробными типами. Для комплексных 4 x 4 матрицы выходному типу нужны дополнительные 3 бита, чтобы вместить рост данных в целой части входных данных; смотрите Использование Эффективный Оборудованием Алгоритм, чтобы Решить Системы Линейных уравнений с комплексным знаком для получения дальнейшей информации.

word_length = 16;
qr_growth_bits = 3;
fraction_length = word_length - 1;
nt = numerictype(1,word_length + qr_growth_bits,fraction_length);

Задайте количество итераций CORDIC

Приближение CORDIC для вращений Givens является итеративным алгоритмом, который дает дополнительный бит точности на итерацию. Для типов данных фиксированной точки со знаком достигается самая большая точность, когда количество выполняемых итераций является тем меньше, чем wordlength.

NumberOfCORDICIterations = nt.WordLength - 1;

Инициализируйте случайные данные

Обработчик данных в этом примере берет комплексные матрицы A и B как входные параметры. В этом примере, A и B заданы как случайные элементы матриц, полученные из равномерного распределения от-1 до 1. Обратите внимание на то, что A и B каждый заданы как 3D массивы, где каждая демонстрационная матрица хранится в первых двух размерностях.

A = fi(complex(2*rand(m,n,num_samples) - 1, 2*rand(m,n,num_samples) - 1),nt);
B = fi(complex(2*rand(m,p,num_samples) - 1, 2*rand(m,p,num_samples) - 1),nt);

Передача данных, чтобы объединить пакет разложение QR

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

Обработка Выходных параметров

Комплексный Burst QR Decomposition данные выходных параметров одна строка за один раз. Каждый раз, когда блок выводит строку результата, он утверждает validOut. Обратите внимание на то, что rOut выводит строки$R$, в то время как cOut выводит строки$Q^HB$. Строки выводятся в обратном порядке, когда это - естественный порядок, чтобы использовать их для задней замены. В этом примере они сохранены как (m * num_samples) x n матрицы, со строками, упорядоченными, когда они были получены.

Симулировать

sim fxpdemo_complex_burst_QR_model

Восстановите решения от выходных данных

Поскольку данные выводятся в обратном порядке, необходимо восстановить данные, чтобы интерпретировать результаты. Следующий код помещает данные в правильном порядке.

C = cell(1,num_samples);
R = cell(1,num_samples);
for ii = 1:num_samples
    C{ii} = flipud(C_Out((ii-1)*m + 1:ii*m,:));
    R{ii} = flipud(R_Out((ii-1)*m + 1:ii*m,:));
end

Оцените точность результата

Чтобы оценить точность блока Complex Burst QR Decomposition, исследуйте величину различия между решением матричного уравнения с помощью блока Complex QR Burst Decomposition и полученное использование, которое удваивает встроенный backsolve MATLAB для. Постройте абсолютную погрешность и число обусловленности для каждой выборки. Данные показывают, что точность решения отслеживает число обусловленности, как ожидается [2].

xAct = cell(1,num_samples);
xExp = cell(1,num_samples);
xErr = zeros(1,num_samples);
condNumber = zeros(1,num_samples);
for ii = 1:num_samples
    xAct{ii} = double(R{ii})\double(C{ii});
    xExp{ii} = double(A(:,:,ii))\double(B(:,:,ii));
    xErr(ii) = norm(xAct{ii} - xExp{ii});
    condNumber(ii) = cond(double(A(:,:,ii)));
end
figure(1)
clf
h1 = subplot(2,1,1);
hold on;
h1.YScale = 'log';
plot(xErr)
grid on
title('Error of ''Complex Burst QR Decomposition''');
ylabel('norm(R\\C - A\\B)');
h2 = subplot(2,1,2);
hold on;
h2.YScale = 'log';
plot(condNumber);
grid on
title('Condition Number of Samples');
ylabel('cond(A)');
xlabel('Test Point');
linkaxes([h1,h2],'x');

Закройте модель

close_system fxpdemo_complex_burst_QR_model

Ссылки

[1] Джордж Э. Форсайт, М.А. Молком и Клив Б. Молер. Компьютерные методы для математических вычислений. Englewood Cliffs, Нью-Джерси: Prentice Hall, 1977.

[2] Клив Б. Молер. Угол Клива: Каково Число обусловленности Матрицы?, MathWorks, Inc. 2017.

[3] Клив Б. Молер. Числовое Вычисление с MATLAB. SIAM, 2004. ISBN: 978-0-898716-60-3.

Для просмотра документации необходимо авторизоваться на сайте