Matlab和Python读取二进制文件的方式不同

2024-10-03 17:19:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在将相同的二进制文件读入Python和Matlab并将其放入一个矩阵中。当我取这个矩阵的范数,我得到不同的结果。在

我使用各自的smatload函数来加载二进制文件。在

Python:

def smatload(filename):
    #print 'opening: ', filename
    f = open(filename, 'rb')
    m = np.fromfile(f,'q',1)
    n = np.fromfile(f,'q',1)
    nnz = np.fromfile(f,'q',1)
    print 'reading %d x %d with %d non-zeros' % (m,n,nnz)
    S = np.fromfile(f,'d',3*nnz)
    f.close()
    S = S.reshape((nnz,3))
    rows = S[:,0].astype(int) - 1
    cols = S[:,1].astype(int) - 1
    vals = S[:,2]
    return csr_matrix((vals,(rows,cols)),shape=(m,n))

Matlab软件:

^{pr2}$

对于返回矩阵的范数,我得到的结果是

Matlab:标准值(A.“fro”)=0.018317077159881

Python:np.linalg.norm公司(A) =0.018317077159760

我已经确认它们都读取了正确的值数目(6590x7126矩阵,122526个非零),并且我对两者都使用了相同的范数(frobenius)。在

你知道是什么原因造成的吗?在


Tags: 文件范数np二进制矩阵filenamerowsint
3条回答

没有答案,但我没有足够的代表来评论。把问题缩小一点值得吗?如果您将原始矩阵划分为4个子矩阵(左上、右上、左下、右下),并将Matlab和Python中报告的每个子矩阵的Frobenius范数进行比较,您是否仍然看到任何值之间的差异?如果是的话,那就冲洗一下,然后再重复这个动作。如果没有,那就不要浪费时间读这篇评论。:-)

显然,Matlab对于稀疏数组和密集数组有不同的实现。使用链接到的54882个非零项的4425x7126稀疏矩阵A和以下命令:

FA=full(A);
av=A(:);
fav=FA(:);

我希望以下命令都产生相同的值,因为它们都在计算A的(非零)元素平方和的平方根:

^{pr2}$

事实上,我们看到了三个稍有不同的答案:

 norm(A,'fro')             0.0223294051001499
 norm(av,2)                0.0223294051001499
 norm(FA,'fro')            0.0223294051001499
 norm(fav,2)               0.0223294051001499

 sqrt( sum(av .* av) )     0.0223294051001521
 sqrt( sum(av .^ 2) )      0.0223294051001521

 sqrt( sum(fav .* fav) )   0.0223294051001506
 sqrt( sum(fav .^ 2) )     0.0223294051001506

事实上,即使是A的稀疏表示和稠密表示的元素之和也是(有点)不同的:

sum(A(:))                 1.00000000000068
sum(FA(:))                1.00000000000035

这些差异似乎与您在Python和Matlab规范之间看到的相同数量级的差异。在

快速查看Frobenius规范可以发现,它需要将所有值平方并将它们相加。在

由于read命令中有uint64,因此看起来您可能正在填充浮点存储。当你把两个二进制数相乘时,需要两倍的位来存储答案。这意味着您需要128位来存储所有的十进制值。如果Python和MATLAB的做法不同,这就可以解释为什么十进制值不同。在

有关MATLAB和Python如何处理浮点精度的信息,请参见以下两个链接:

Python: https://docs.python.org/2/tutorial/floatingpoint.html

MATLAB软件: http://blogs.mathworks.com/cleve/2014/07/07/floating-point-numbers/

相关问题 更多 >