R может решать недоопределенные линейные системы:
A = matrix((1:12)^2,3,4,T)
B = 1:3
qr(A)$rank # 3
qr.solve(A, B) # solutions will have one zero, not necessarily the same one
# 0.1875 -0.5000 0.3125 0.0000
solve(qr(A, LAPACK = TRUE), B)
# 0.08333333 -0.18750000 0.00000000 0.10416667
(Это дает одно решение среди бесконечности решений).
Однако, если ранг (здесь 2) меньше количества строк (здесь 3), он не будет работать:
A = matrix(c((1:8)^2,0,0,0,0),3,4,T)
B = c(1,2,0)
A
# [,1] [,2] [,3] [,4]
# [1,] 1 4 9 16
# [2,] 25 36 49 64
# [3,] 0 0 0 0
qr.solve(A, B) # Error in qr.solve(A, B) : singular matrix
solve(qr(A, LAPACK = TRUE), B) # Error in qr.coef(a, b) : error code 3
но у этой системы есть решение!
Я знаю, что общее решение состоит в том, чтобы использовать SVD или обобщенную / псевдообратную A (см. этот вопрос и его ответы), но:
Существует ли среднее значение с solve
или qr.solve
для автоматического сокращения системы AX = B до эквивалентной системы CX = D только строк ранга (A) , для которых qr.solve(C, D)
будет просто работать "из коробки"?
Пример:
C = matrix(c((1:8)^2),2,4,T)
D = c(1,2)
qr.solve(C, D)
# -0.437500 0.359375 0.000000 0.000000