R Несовместимое произведение матричных инверсий - PullRequest
0 голосов
/ 24 октября 2018

У меня есть матрица emat, полученная путем взятия суммы внешних произведений векторов.Он должен быть симметричным и положительно определенным.Я обнаружил, что

solve(emat) %*% solve(emat)

генерирует результат, отличный от

bmat <- solve(emat)
bmat %*% t(bmat)

На самом деле, они существенно отличаются (печатная продукция emat сокращается на R).

> emat
        V1        V2        V3
1 170.2939  15.77391 110.75499
2  15.7739 444.57862   8.87082
3 110.7550   8.87082  72.03669
> solve(emat) %*% solve(emat) - bmat %*% t(bmat)
       1         2 3
V1 -1024  48.00000 0
V2     8  -0.21875 0
V3  2048 -72.00000 0

Но это не должно иметь место.

Это ошибка?Или это проблема с точностью?Или это связано с тем, как R обрабатывает матрицы, хранящиеся в памяти?

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Ваша матрица emat не является симметричной, см., Например, emat[1,2] != emat[2,1]

Попробуйте выполнить

emat <- matrix(c(170.2939, 15.77391, 110.75499, 15.7739, 444.57862, 8.87082, 110.7550, 8.87082, 72.03669),ncol=3)
emat <- round(emat,4)
bmat <- solve(emat)

solve(emat) %*% solve(emat) - bmat %*% t(bmat)

, где при округлении учитывается, что ваши данные симметричны (в данном конкретном примере, так как ваши данные достаточно близки, чтобы быть одинаковыми после округления ...).

0 голосов
/ 24 октября 2018

Проблема может быть из вашей матрицы Emat.Я попробовал, и это сработало для меня.

emat <- matrix(c(2,-1,0,-1,2,-1,0,-1,2),3,3)

# check your matrix to see if it is positive definite matrix or not
library(matrixcalc)
is.positive.definite(emat)

bmat <- solve(emat)

# the result of the following is zero matrix
solve(emat) %*% solve(emat) - bmat %*% t(bmat)

enter image description here

Если ваша матрица не симметрична (поэтому не является положительно определенной), результат не будет равен нулю, так как emat не равно t(emat).

enter image description here

...