В этом примере показано, как использовать эффективную оборудованием Комплексную Частично-систолическую Матрицу, Решают Используя Разложение Q-less QR с блоком Forgetting Factor.
Комплексная Частично-систолическая Матрица Решает Используя Разложение Q-less QR с реализациями блока Forgetting Factor следующую рекурсию, чтобы вычислить верхний треугольный множитель R непрерывной потоковой передачи n-1 векторы-строки (k, :) с помощью упущения фактора. Это - как будто матрица А бесконечно высока. Упущение включает область значений, мешает ему объединяться без связанного.
Когда верхний треугольный множитель готов, затем передайте, и обратная подстановка вычисляются с текущим входом B, чтобы произвести выход X.
n
длина векторов-строк (k, :), количество строк в B и количество строк и столбцов в R.
n = 5;
p
количество столбцов в B
p = 1;
m
эффективные количества строк, чтобы объединяться.
m = 100;
Используйте fixed.forgettingFactor
функция, чтобы вычислить фактор упущения в зависимости от количества строк, которые вы интегрируете.
forgettingFactor = fixed.forgettingFactor(m)
forgettingFactor = 0.9950
precisionBits
задает количество битов точности, требуемой для Разложения QR. Установите это значение согласно системным требованиям.
precisionBits = 24;
В этом примере матрицы с комплексным знаком A и B создаются таким образом, что величина их действительных и мнимых частей их элементов меньше чем или равна одному, таким образом, максимальное возможное абсолютное значение любого элемента. Ваши собственные системные требования зададут, каковы те значения. Если вы не знаете то, что они, и A и B являются входом фиксированной точки к системе, то можно использовать upperbound
функция, чтобы определить верхние границы фиксированных точек A и B.
max_abs_A
верхняя граница на максимальном элементе массива величины.
max_abs_A = sqrt(2);
max_abs_B
верхняя граница на максимальном элементе величины B.
max_abs_B = sqrt(2);
Используйте fixed.complexQlessQRMatrixSolveFixedpointTypes
функция, чтобы вычислить фиксированные точки.
T = fixed.complexQlessQRMatrixSolveFixedpointTypes(m,n,max_abs_A,max_abs_B,precisionBits);
T.A
фиксированная точка, вычисленная для преобразования к R, оперативному так, чтобы это не переполнялось.
T.A
ans = [] DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 30 FractionLength: 24
T.B
тип, вычисленный для B так, чтобы это не переполнялось.
T.B
ans = [] DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 27 FractionLength: 24
T.X
тип, вычисленный для выхода X так, чтобы была низкая вероятность переполнения.
T.X
ans = [] DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 75 FractionLength: 24
Создайте случайную матрицу А, чтобы содержать конкретное количество входных параметров и n-by-p случайную матрицу B.
numInputs
количество входных строк A (k, :) для этого примера.
numInputs = 500;
rng('default')
[A,B] = fixed.example.complexRandomQlessQRMatrices(numInputs,n,p);
Бросьте входные параметры к типам, определенным fixed.complexQlessQRMatrixSolveFixedpointTypes
.
A = cast(A,'like',T.A); B = cast(B,'like',T.B);
Используйте fixed.extractNumericType
функционируйте, чтобы извлечь numerictype
возразите, чтобы использовать в качестве входного параметра с блоком.
OutputType = fixed.extractNumericType(T.X)
OutputType = DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 75 FractionLength: 24
Бросьте фактор упущения к фиксированной точке с тем же размером слова как A и масштабирование лучшей точности.
forgettingFactor = fi(forgettingFactor,1,T.A.WordLength);
Выберите время остановки для симуляции, которая достаточно долга, чтобы обработать все входные параметры от A.
stopTime = 2*(2*numInputs + n)*T.A.WordLength;
model = 'ComplexPartialSystolicSolveQlessQRForgettingFactorModel';
open_system(model);
Используйте функцию помощника setModelWorkspace
добавить переменные, заданные выше к рабочему пространству модели.
fixed.example.setModelWorkspace(model,'A',A,'B',B,'n',n,'p',p,... 'forgettingFactor',forgettingFactor,'OutputType',OutputType,... 'stopTime',stopTime);
out = sim(model);
Задайте матрицу можно следующим образом
Затем с помощью формулы для расчета th выход и то, что, можно показать это
Таким образом проверить выход, различие между и должно быть малым.
Выберите последний выход симуляции.
X = double(out.X(:,:,end));
Синхронизируйте последний выход X с входом путем нахождения количества входных параметров, которые произвели его.
A = double(A); B = double(B); alpha = double(forgettingFactor); relative_errors = nan(1,numInputs); for k = 1:numInputs A_k = alpha.^(k:-1:1)' .* A(1:k,:); relative_errors(k) = norm(A_k'*A_k*X - B)/norm(B); end
k
количество входных параметров (k, :) который произвел последнее X.
k = find(relative_errors==min(relative_errors))
k = 493
VerifyThat
с небольшой относительной погрешностью.
A_k = alpha.^(k:-1:1)' .* A(1:k,:); relative_error = norm(A_k'*A_k*X - B)/norm(B)
relative_error = 4.0692e-05
Подавите mlint предупреждения в этом файле.
%#ok<*NOPTS>
Complex Partial-Systolic Matrix Solve Using Q-less QR Decomposition with Forgetting Factor