В этом примере показано, как использовать эффективное оборудованием Действительное Частично-систолическое Разложение Q-less QR с блоком Forgetting Factor.
Действительное Частично-систолическое Разложение Q-less QR с блоком Forgetting Factor реализует следующую рекурсию, чтобы вычислить верхний треугольный множитель R непрерывной потоковой передачи n-1 векторы-строки (k, :) с помощью упущения фактора. Это - как будто матрица А бесконечно высока. Упущение включает область значений, мешает ему объединяться без связанного.
n
длина векторов-строк (k, :) и количество строк и столбцов в R.
n = 5;
m
эффективные количества строк, чтобы объединяться.
m = 100;
Используйте fixed.forgettingFactor
функция, чтобы вычислить фактор упущения в зависимости от количества строк, которые вы интегрируете.
forgettingFactor = fixed.forgettingFactor(m)
forgettingFactor = 0.9950
precisionBits
задает количество битов точности, требуемой для Разложения QR. Установите это значение согласно системным требованиям.
precisionBits = 24;
В этом примере матрица А с действительным знаком создается таким образом, что величина ее элементов меньше чем или равна одному. Ваши собственные системные требования зададут, каковы те значения. Если вы не знаете то, что они, и A является входом фиксированной точки к системе, то можно использовать upperbound
функция, чтобы определить верхние границы фиксированных точек A.
max_abs_A
верхняя граница на максимальном элементе массива величины.
max_abs_A = 1;
Используйте fixed.qlessqrFixedpointTypes
функция, чтобы вычислить фиксированные точки.
T = fixed.qlessqrFixedpointTypes(m,max_abs_A,precisionBits)
T = struct with fields: A: [0x0 embedded.fi]
T.A
фиксированная точка, вычисленная для преобразования к R, оперативному так, чтобы это не переполнялось.
T.A
ans = [] DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 30 FractionLength: 24
Создайте случайную матрицу А, чтобы содержать конкретное количество входных параметров.
numInputs
количество входных строк A (k, :) для этого примера.
numInputs = 500;
rng('default')
A = fixed.example.realUniformRandomArray(-1,1,numInputs,n);
Бросьте входные параметры к типам, определенным fixed.qlessqrFixedpointTypes
.
A = cast(A,'like',T.A);
Бросьте фактор упущения к фиксированной точке с тем же размером слова как A и масштабирование лучшей точности.
forgettingFactor = fi(forgettingFactor,1,T.A.WordLength);
Выберите время остановки для симуляции, которая достаточно долга, чтобы обработать все входные параметры от A.
stopTime = 2*numInputs*T.A.WordLength;
model = 'RealPartialSystolicQlessQRForgettingFactorModel';
open_system(model);
Используйте функцию помощника setModelWorkspace
добавить переменные, заданные выше к рабочему пространству модели.
fixed.example.setModelWorkspace(model,'A',A,'n',n,... 'forgettingFactor',forgettingFactor,... 'stopTime',stopTime);
out = sim(model);
Задайте матрицу можно следующим образом
Затем с помощью формулы для расчета th выход и то, что, можно показать это
Таким образом проверить выход, различие между и должно быть малым.
Выберите последний выход симуляции.
R = double(out.R(:,:,end))
R = 5.2822 0.0429 -0.1900 0.4328 -0.0822 0 5.5458 0.0530 0.0010 -0.6132 0 0 5.4749 0.0189 -0.1017 0 0 0 5.6960 -0.1255 0 0 0 0 5.5661
Проверьте, что R верхний треугольный.
isequal(R,triu(R))
ans = logical 1
Проверьте, что диагональ больше или равна нулю.
diag(R)
ans = 5.2822 5.5458 5.4749 5.6960 5.5661
Синхронизируйте последний выход R с входом путем нахождения количества входных параметров, которые произвели его.
A = double(A); alpha = double(forgettingFactor); relative_errors = nan(1,n); for k = 1:numInputs A_k = alpha.^(k:-1:1)' .* A(1:k,:); relative_errors(k) = norm(A_k'*A_k - R'*R)/norm(A_k'*A_k); end
k
количество входных параметров (k, :) который произвел последний R.
k = find(relative_errors==min(relative_errors),1,'last')
k = 497
VerifyThat
с небольшой относительной погрешностью.
A_k = alpha.^(k:-1:1)' .* A(1:k,:); relative_error = norm(A_k'*A_k - R'*R)/norm(A_k'*A_k)
relative_error = 7.2555e-06
Подавите mlint предупреждения в этом файле.
%#ok<*NOPTS>
Real Partial-Systolic Q-less QR Decomposition with Forgetting Factor