Skip to main content
 首页 » 编程设计

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

2025年05月04日14shangdawei

我正在将同一个二进制文件读入 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:

function [A] = smatload(filename) 
 
fid = fopen(filename,'r'); 
if( fid == -1 ) 
    disp(sprintf('Error: Unable to open file [%s], fid=%d\n',filename,fid)); 
    A = [-1]; 
    fclose(fid); 
    return; 
end 
 
m   = fread(fid,[1 1],'uint64'); 
n   = fread(fid,[1 1],'uint64'); 
nnz = fread(fid,[1 1],'uint64'); 
 
fprintf('Reading %d x %d with %d non-zeros\n',m,n,nnz); 
 
S = fread(fid,[3 nnz],'double'); 
fclose(fid); 
A = sparse(S(1,:)',S(2,:)',S(3,:)',m,n); 

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

Matlab: 范数(A.'来回') = 0.018317077159881

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

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

关于可能导致此问题的任何想法?

请您参考如下方法:

快速浏览 Frobenius 范数表明它需要对所有值进行平方并将它们相加。

由于您在读取命令中使用了 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/