Этот пример демонстрирует, как вычислить разложение QR комплексных матриц с помощью эффективного оборудованием кода MATLAB® в Simulink®. Эта модель совместно использует вычислительные ресурсы через шаги Алгоритма разложения QR. Это таким образом использует меньше на ресурсах чипа, чем полностью конвейерный подход при принесении в жертву некоторой общей пропускной способности.
При решении матричных уравнений редко, если когда-либо, необходимо вычислить инверсию матрицы [1] [3]. Блок Complex Burst QR Decomposition предоставляет оборудованию эффективный способ решить уравнение
где комплекс m x n матрица, является комплексом n x p матрица и является комплексом m x p матрица. Это уравнение может быть преобразовано в форму
через ряд ортогональных преобразований. Здесь, комплекс m x n верхняя треугольная матрица. комплекс m x m ортогональная матрица, таким образом что. Комплексный Пакет Разложение QR сохраняет только ненулевые строки, наряду с соответствующими строками.
Разложение QR хорошо подходит для архитектуры фиксированной точки, потому что оно может быть полностью выполнено с вращениями Givens. Они имеют эффективную реализацию фиксированной точки с точки зрения Алгоритма CORDIC. Для получения дополнительной информации на алгоритме для фиксированной точки разложение QR, смотрите, Выполняют QR-факторизацию Используя CORDIC. Модель Simulink, используемая в этом примере:
fxpdemo_complex_burst_QR_model
Эта модель работает с фиксированной точкой, дважды, одним, и масштабируемыми двойными типами данных.
Блок Complex Burst QR Decomposition берет четыре входных параметра. Маску для этого блока показывают ниже:
Необходимо присвоить входные данные переменным в рабочем пространстве MATLAB. Чтобы настроить этот алгоритм, измените данные согласно процедурам, используемым в следующих разделах.
Архитектура модели выделяет минимальную память, необходимую, чтобы хранить данные, должен был выполнить разложение QR. Поэтому размер входных матриц должен быть известен во время компиляции. Здесь, m
является количеством строк в комплексных матрицах A
и B
, n
является количеством столбцов в A
, и p
является количеством столбцов в B
.
Кроме того, поскольку блок может обработать разложение неопределенного количества матриц последовательно, много выборок задан. Модель останавливается, когда все выборки использовались.
m = 4; n = 4; p = 4; num_samples = 100;
Прежде, чем сгенерировать входные данные, важно задать тип данных матричных данных как показано ниже. Этот пример использует подписанные фиксированные точки с размерами слова на 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)
nt = DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 19 FractionLength: 15
Приближение CORDIC для вращений Givens является итеративным алгоритмом, который дает дополнительный бит точности на итерацию. Для типов данных фиксированной точки со знаком достигается самая большая точность, когда количество выполняемых итераций является тем меньше, чем wordlength.
NumberOfCORDICIterations = nt.WordLength - 1
NumberOfCORDICIterations = 18
Обработчик данных в этом примере берет комплексные матрицы 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);
Порт ready
инициировал подсистему Обработчика Данных. Когда ready
высок, блок утверждает validIn
и отправляет следующую строку A
и B
к aIn
и bIn
. Протокол для передачи данных позволяет данным быть отправленными каждый раз, когда ready
высок, гарантируя, что все данные обрабатываются. Если данные будут отправлены, когда ready
не будет высок, это не будет обработано.
Комплексный Burst QR Decomposition данные выходных параметров одна строка за один раз. Каждый раз, когда блок выводит строку результата, он утверждает validOut
. Обратите внимание на то, что rOut
выходные параметры строки, в то время как cOut
выходные параметры строки. Строки выводятся в обратном порядке, когда это - естественный порядок, чтобы использовать их для задней замены. В этом примере они сохранены как (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
Чтобы оценить точность Пакета Разложение QR, исследуйте значение различия между решением матричного уравнения с помощью блока '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.
%#ok<*NASGU,*NOPTS>