Разобьем положительно определенную квадратную матрицу на две одинаковые матрицы

просто я хочу разделить положительно определенную матрицу n*n на идентичную матрицу n*r B, где r произвольно, другими словами:

B*B^T=A
(n*r)*(n*r)^T=(n*n)

Редактировать: я думаю, что это была моя вина, плохо описывающая мою проблему. пусть B будет матрицей размерности (n*r). передайте его функции A=f(B^T*B), где A равно (n*n). Я знаю, что эта функция сохранит ранг матрицы, другими словами rank(A)=rank(B'*B). теперь я хочу извлечь новый B. так что новый B снова имеет (n*r).


person Amin.A    schedule 16.05.2012    source источник
comment
нижнее измерение r произвольно - r не является произвольным в соответствии с вашим заголовком; г‹=n   -  person ninjagecko    schedule 16.05.2012


Ответы (1)


Предположим, у вас есть следующий пример:

n = 4;
rng(0)
A = rand(n,n);
B = A * A';

Если матрица B имеет полный ранг, вы не можете точно покрыть исходную матрицу, используя меньшее количество измерений. Таким образом, вы можете только аппроксимировать его. Ключевая идея здесь состоит в том, чтобы свести к минимуму ошибку реконструкции.

Вы можете разложить B на собственные векторы, используя разложение по собственным значениям. Вы можете использовать eig в MATLAB, но вам нужно отсортировать собственные значения и соответствующие собственные векторы впоследствии. Вместо этого я предпочитаю разложение по единственному числу и использую svd в MATLAB. Обратите внимание, что SVD дает оптимальное решение для ошибки реконструкции в матричной аппроксимации низкого ранга.

[U,S,~] = svd(B);
U = U * sqrt(S);

Мы знаем, что B = U * U' сейчас. См. взаимосвязь между SVD и разложением по собственным значениям здесь.

Как я уже сказал, нам нужно аппроксимировать его. Я выбираю размеры, покрывающие 99% общей дисперсии, следующим образом:

coverage =  cumsum(diag(S.^2));
coverage = coverage ./ norm(S,'fro')^2;
[~, nEig] = max(coverage > 0.99);
U2 = U(:,1:nEig);

U2 имеет 2 столбца вместо 4 в этом случае. Если данные коррелированы, выигрыш будет еще меньше. Результаты приведены ниже:

B
B1 = U*U'
B2 = U2*U2'

B =

    2.8966    2.1881    1.1965    2.1551
    2.1881    1.9966    0.6827    1.8861
    1.1965    0.6827    0.7590    0.5348
    2.1551    1.8861    0.5348    2.0955


B1 =

    2.8966    2.1881    1.1965    2.1551
    2.1881    1.9966    0.6827    1.8861
    1.1965    0.6827    0.7590    0.5348
    2.1551    1.8861    0.5348    2.0955


B2 =

    2.8896    2.2134    1.1966    2.1385
    2.2134    1.9018    0.6836    1.9495
    1.1966    0.6836    0.7586    0.5339
    2.1385    1.9495    0.5339    2.0528

Кажется, это хорошее приближение.

person petrichor    schedule 16.05.2012
comment
ну, это был отличный ответ, но, как я уже сказал, мне нужно иметь произвольное r, это решение всегда даст мне r = 4. - person Amin.A; 16.05.2012
comment
Нет, он дает вам тот, который вам нужен. Проверьте размеры U2. nEig нужно изменить. При желании вы можете установить его вручную. - person petrichor; 16.05.2012
comment
извините за непонимание петрикора. - person Amin.A; 16.05.2012
comment
хорошо, потому что в итерациях значение r увеличивается. теперь я застрял, когда r становится больше, чем n. даже если есть доказательство того, что это невозможно сделать, я был бы рад узнать об этом. извините, что этот вопрос стал длинным. - person Amin.A; 16.05.2012
comment
О, я не в курсе методов при увеличении r :( - person petrichor; 16.05.2012
comment
все в порядке, большое спасибо petrichor за ваше время. я очень ценю это - person Amin.A; 16.05.2012