Минимизация разности матриц при условии ограничений по диагонали блоков - PullRequest
0 голосов
/ 03 марта 2020

У меня есть матрица W, которая является блочной диагональной матрицей с размерами 2 * 4, и каждая из ее двух блочных диагоналей имеет вектор 1 * 2. Я хочу найти значения его записей, которые минимизируют разницу между следующей функцией: (F = BH-AW) Где: W - требуемая диагональная матрица блока, которую нужно оптимизировать, B - матрица 2 * 2, H - заданная Матрица 2 * 4, а матрица 2 * 2. A и B рассчитываются с использованием функций, используемых в прилагаемом коде. Я попробовал этот прикрепленный код, но я думаю, что теперь он бесконечно l oop, и я не знаю, что мне делать?

    %% My code is:

while ((B*H)-(A*W)~=zeros(2,4))
            w1=randn(1,2); 
% generate the first block diagonal vector with dimensions 1*2. The values of each entry of the block diagonal vector maybe not the same.

            w2=randn(1,2); 
% generate the second block diagonal vector with dimensions 1*2.
            W=blkdiag(w1,w2); 
% build the block diagonal matrix that I want to optimize with dimensions 2*4.

            R=sqrtm(W*inv(inv(P)+(H'*inv(eye(2)+D)*H))*W'); 
% R is a 2*2 matrix that will be used to calculate matrix A using the LLL lattice reduction algorithm. The values of P (4*4 matrix), H (2*4 matrix) and D (2*2 matrix) are given. It's clear here that matrix R is a function of W.

            A= LLL(R,3/4); 
% I use here LLL lattice reduction algorithm to obtain 2*2 matrix A which is function of R.

            B=A'*W*P*H'*inv(eye(2)+D+H*P*H'); 
% B is 2*2 matrix which is function of A and W. The values of P (4*4 matrix), H (2*4 matrix) and D (2*2 matrix) are given.

        end

1 Ответ

0 голосов
/ 04 марта 2020

Числовые операции с числами с плавающей запятой на компьютере являются только приблизительными (любое число всегда представлено только конечным числом битов, что означает, что вы не можете точно представить Pi, например). Для получения дополнительной информации см. эту ссылку .

Следовательно, крайне маловероятно, что написанное вами l oop когда-либо прекратится, поскольку разница между B*H и A*W будет не быть точно нулем. Вместо этого вам нужно использовать коэффициент допуска , чтобы решить, когда вы удовлетворены достигнутым сходством.

Кроме того, как предлагают другие в комментарии, «расстояние» между двумя матрицами обычно измеряется с использованием некоторого рода нормы (например, нормы Фробениуса). По умолчанию функция norm в Matlab выдаст 2-норму входной матрицы.

В вашем случае это даст что-то вроде:

tol = 1e-6;

while norm(B*H-A*W) > tol

    % generate the first block diagonal vector with dimensions 1*2. 
    % The values of each entry of the block diagonal vector maybe not the same.
    w1=randn(1,2); 

    % generate the second block diagonal vector with dimensions 1*2.
    w2=randn(1,2); 

    % build the block diagonal matrix that I want to optimize with dimensions 2*4.
    W=blkdiag(w1,w2); 

    % R is a 2*2 matrix that will be used to calculate matrix A using the LLL lattice reduction algorithm. 
    % The values of P (4*4 matrix), H (2*4 matrix) and D (2*2 matrix) are given. 
    % It's clear here that matrix R is a function of W.
    R=sqrtm(W/(inv(P)+(H'/(eye(2)+D)*H))*W'); 

    % I use here LLL lattice reduction algorithm to obtain 2*2 matrix A which is function of R.
    A= LLL(R,3/4); 

    % B is 2*2 matrix which is function of A and W. The values of P (4*4 matrix), 
    % H (2*4 matrix) and D (2*2 matrix) are given.
    B=A'*W*P*H'/(eye(2)+D+H*P*H'); 

end

Обратите внимание, что:

  • Что касается фактического алгоритма, я немного обеспокоен тем, что ваш l oop никогда не обновляет значение W, а вместо этого обновляет матрицы A и B. Это говорит о том, что ваше описание проблемы может быть неправильным или неполным, но это все равно выходит за рамки этого форума (спросите по Maths.SE , если хотите узнать больше).

  • Использование inv() напрямую во многих случаях не рекомендуется. Это связано с тем, что алгоритм вычисления обратной матрицы является менее надежным, чем алгоритм для решения систем типа AX=B. Matlab должен предупредить вас о необходимости использовать / и \; Я бы посоветовал следовать этой рекомендации, если вы не знаете, что делаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...