ginv()
chức năng từ MASS
gói trong R tạo ra các giá trị hoàn toàn khác so với hàm MATLAB pinv()
. Cả hai đều yêu cầu sản xuất nghịch đảo tổng quát Moore-Penrose của một ma trận.R ginv và Matlab pinv tạo ra các kết quả khác nhau
Tôi đã cố gắng đặt cùng một dung sai cho việc triển khai R nhưng sự khác biệt vẫn tồn tại.
- MATLAB tol mặc định:
max(size(A)) * norm(A) * eps(class(A))
- R mặc định tol:
sqrt(.Machine$double.eps)
sinh sản:
R:
library(MASS)
A <- matrix(c(47,94032,149, 94032, 217179406,313679,149,313679,499),3,3)
ginv(A)
kết quả đầu ra:
012. [,1] [,2] [,3]
[1,] 1.675667e-03 -8.735203e-06 5.545605e-03
[2,] -8.735203e-06 5.014084e-08 -2.890907e-05
[3,] 5.545605e-03 -2.890907e-05 1.835313e-02
svd(A)
kết quả đầu ra:
$d
[1] 2.171799e+08 4.992800e+01 2.302544e+00
$u
[,1] [,2] [,3]
[1,] -0.0004329688 0.289245088 -9.572550e-01
[2,] -0.9999988632 -0.001507826 -3.304234e-06
[3,] -0.0014443299 0.957253888 2.892454e-01
$v
[,1] [,2] [,3]
[1,] -0.0004329688 0.289245088 -9.572550e-01
[2,] -0.9999988632 -0.001507826 -3.304234e-06
[3,] -0.0014443299 0.957253888 2.892454e-01
MATLAB:
A = [47 94032 149; 94032 217179406 313679; 149 313679 499]
pinv(A)
kết quả đầu ra:
ans =
0.3996 -0.0000 -0.1147
-0.0000 0.0000 -0.0000
-0.1147 -0.0000 0.0547
svd:
[U, S, V] = svd(A)
U =
-0.0004 0.2892 -0.9573
-1.0000 -0.0015 -0.0000
-0.0014 0.9573 0.2892
S =
1.0e+008 *
2.1718 0 0
0 0.0000 0
0 0 0.0000
V =
-0.0004 0.2892 -0.9573
-1.0000 -0.0015 -0.0000
-0.0014 0.9573 0.2892
Số điều kiện ('cond') cho ma trận đó là khá lớn cho biết nó gần như số ít. Nhưng điều đó trong và của chính nó không nên giải thích tại sao các kết quả khác nhau bởi rất nhiều. – horchler
Xác nhận rằng [Wolfram Alpha đồng ý với MATLAB] (http://www.wolframalpha.com/input/?i=PseudoInverse%5B%7B%7B47.,+94032,+149%7D,%7B+94032,+217179406 , + 313679% 7D,% 7B + 149, + 313679, + 499% 7D% 7D% 5D) – MichaelChirico
Theo định nghĩa, 'A% *% ginv (A)% *% A' trong' R' gần giống với ' A', trong khi kết quả 'MATLAB' tạo ra một cái gì đó rất khác với' A', có vẻ như vậy. – nicola