【发布时间】:2015-04-26 19:36:23
【问题描述】:
我正在将相同的二进制文件读入 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: norm(A.'fro') = 0.018317077159881
Python:np.linalg.norm(A) = 0.018317077159760
我已确认它们都读取了正确数量的值(6590x7126 矩阵,122526 个非零),并且我对两者使用了相同的规范 (frobenius)。
关于什么可能导致这种情况的任何想法?
【问题讨论】:
-
这可能只是 MATLAB 做各种事情来提高浮点数学精度的一个例子。我知道,在 MATLAB 中,如果您将 0.01 1,000,000 次相加,您实际上会得到 10,000,而不是您在大多数其他语言中得到的稍有偏差的版本。
-
我曾在其他时候将这个功能用于我正在做的项目中,但我没有看到任何区别。我很好奇为什么现在会出现这种情况。这导致了我的 Matlab 解决方案没有遇到的问题。
-
所以您在处理 100,000 个浮点数时担心小数点后 12 位的差异?不是很相关,但是我很好奇MATLAB数组是否可以保存到.mat文件中,并用
scipy.io.loadmat读取,结果是否相同。 -
鉴于我正在做的实验,它会导致收敛标准出现一些问题。让我检查一下,我会更新我的帖子。
-
@David 您以前使用该函数是否涉及如此大的矩阵?我可以很容易地看到一个 6590x7126 矩阵的数字太大,以至于典型的浮点表示无法获得高精度。
标签: python matlab file numpy binary