【发布时间】:2019-12-10 07:18:13
【问题描述】:
我正在尝试在 Julia 中转录 Python 代码。我有一个矩阵
test = [2.0 3.0 4.0
3.0 4.0 5.0
4.0 5.0 6.0]
我正在使用numpy.linalg.pinv 在 Python 中计算矩阵的 (Moore-Penrose) 伪逆,结果是
[[-8.33333333e-01 -1.66666667e-01 5.00000000e-01]
[-1.66666667e-01 -7.86535165e-17 1.66666667e-01]
[ 5.00000000e-01 1.66666667e-01 -1.66666667e-01]]
在 Julia 中,LinearAlgebra.pinv(test) 的结果是
3×3 Array{Float64,2}:
-1.33333 -0.166667 1.0
-0.166667 -6.59195e-17 0.166667
1.0 0.166667 -0.666667
我想问是否有人知道为什么这两种情况下的结果不同,以及我可以做些什么来使它们匹配。到目前为止,我已经尝试过LinearAlgebra.pinv(test[1:3,1:3]),结果也因未知原因而有所不同,但仍然与Python输出不匹配。
上面的“测试”矩阵确实是一个测试用例,以简化最小工作示例中的代码,实际代码可以在下面找到。
Python中的完整代码是:
import numpy as np
import random as rd
import matplotlib.pyplot as plt
n_bin = 8
A = 5.
sigma_G = 3.
G_temp = np.zeros((n_bin,n_bin))
for i in range(n_bin):
for j in range(n_bin):
G_temp[i,j] = A*np.exp(-(1/2)*((i-j)**2)/sigma_G**2)
G_matrix = np.matmul(G_temp,G_temp.T)
G_inv = np.linalg.pinv(G_matrix)
Julia 中的代码是:
using LinearAlgebra
using Distributions
using Base
n_bin = 8
A = 5.
sigma_G = 3.
G_temp = zeros(n_bin,n_bin)
for i = 1:n_bin
for j = 1:n_bin
G_temp[i,j] = A*exp(-(1/2)*((i-j)^2)/sigma_G^2)
end
end
G_matrix = G_temp*transpose(G_temp)
G_inv = LinearAlgebra.pinv(G_matrix)
【问题讨论】:
-
您在 Python 中构建了一个完全不同的
test矩阵。print(test)看看。 -
嗨@Ine,请不要粘贴代码或输出为图像或链接。这使得一切都很难遵循。我现在已经内联了内容,请确保它仍然匹配。
-
旁注:如果您发现自己在任何时候都在写
pinv(A) * x,而不需要伪逆本身,请改用A \ x。这样做更有效。 -
您的两个代码 sn-ps,就目前而言,在两种语言中都给我完全相同的结果(在浮点精度容差范围内)。运行时到底有什么不同?
-
两个sn-ps的结果都在我的初帖中。
标签: python julia matrix-inverse