Den*_*din 14 diff matlab file mat-file
我正在寻找一种方法来列出两个.mat文件之间的差异,这对许多人来说都是有用的.
虽然我搜遍了我能想到的任何地方,但我找不到任何符合我要求的东西:
我最接近的是visdiff.只要我留在matlab中,它就可以让我浏览差异,但是当我保存结果时它只显示我的最高级别.
以下是我的文件通常如下所示的简化示例:
a = 6;
b.c.d = 7;
b.c.e = 'x';
save f1
f = a;
clear a
b.c.e = 'y';
save f2
visdiff('f1.mat','f2.mat')
Run Code Online (Sandbox Code Playgroud)
如果我点击这里b,我可以找到差异.但是如果我运行它并使用'file> save',我无法点击b.因此,我仍然不知道改变了什么.
注意:我没有Simulink
因此我的问题是:
如何在没有Matlab的情况下向2人显示2个mat文件之间的所有差异
以下是我个人认为最适合不同情况的答案:
您可以使用HDF5工具找到基于HDF5的.mat文件之间的差异.
让我简短一下您的MATLAB示例,并假设您创建了两个mat文件
clear ; a = 6 ; b.c = 'hello' ; save -v7.3 f1
clear ; a = 7 ; b.e = 'world' ; save -v7.3 f2
Run Code Online (Sandbox Code Playgroud)
在MATLAB之外使用
h5ls -v -r f1.mat
Run Code Online (Sandbox Code Playgroud)
获取有关f1.mat包含的数据类型的列表:
Opened "f1.mat" with sec2 driver.
/ Group
Location: 1:96
Links: 1
/a Dataset {1/1, 1/1}
Attribute: MATLAB_class scalar
Type: 6-byte null-terminated ASCII string
Data: "double"
Location: 1:2576
Links: 1
Storage: 8 logical bytes, 8 allocated bytes, 100.00% utilization
Type: native double
/b Group
Attribute: MATLAB_class scalar
Type: 6-byte null-terminated ASCII string
Data: "struct"
Location: 1:800
Links: 1
/b/c Dataset {5/5, 1/1}
Attribute: H5PATH scalar
Type: 2-byte null-terminated ASCII string
Data: "/b"
Attribute: MATLAB_class scalar
Type: 4-byte null-terminated ASCII string
Data: "char"
Attribute: MATLAB_int_decode scalar
Type: native int
Data: 2
Location: 1:1832
Links: 1
Storage: 10 logical bytes, 10 allocated bytes, 100.00% utilization
Type: native unsigned short
Run Code Online (Sandbox Code Playgroud)
用于
h5ls -d -r f1.mat
Run Code Online (Sandbox Code Playgroud)
返回存储数据的值:
/ Group
/a Dataset {1, 1}
Data:
(0,0) 6
/b Group
/b/c Dataset {5, 1}
Data:
(0,0) 104, 101, 108, 108, 111
Run Code Online (Sandbox Code Playgroud)
数据104, 101, 108, 108, 111代表单词hello,可以看到
h5ls -d -r f1.mat | tail -1 | awk '{FS=",";printf("%c%c%c%c%c \n",$2,$3,$4,$5,$6)}'
Run Code Online (Sandbox Code Playgroud)
您可以获得f2.mat的相同列表,并使用您选择的工具比较两个输出.
比较也可直接与HDF5工具配合使用.要比较a两个文件中的两个数字使用
h5diff -r f1.mat f2.mat /a
Run Code Online (Sandbox Code Playgroud)
这将告诉你价值观和他们的差异
dataset: </a> and </a>
size: [1x1] [1x1]
position a a difference
------------------------------------------------------------
[ 0 0 ] 6 7 1
1 differences found
attribute: <MATLAB_class of </a>> and <MATLAB_class of </a>>
0 differences found
Run Code Online (Sandbox Code Playgroud)
HDF5工具中还有一些命令和选项,可能有助于解决您的实际问题.
二进制发行版可从HDF Group获得Linux和Windows .对于OS X,您可以通过MacPorts安装它们.如果需要,还有一个GUI:HDFView.
如果你有simulink,你可以Simulink.saveVars用来生成一个m文件,在执行时在工作空间中创建相同的变量:
a = 6;
b.c.d = 7;
b.c.e = 'x';
Simulink.saveVars('f1');
f = a;
clear a
b.c.e = 'y';
Simulink.saveVars('f2');
visdiff('f1.m','f2.m')
Run Code Online (Sandbox Code Playgroud)
正如这个sctreenshot所示

请注意,默认情况下,它将数组中的元素数限制为1000,您可以将其增加到10000.大于该限制的数组将保存在单独的mat文件中.
更新:从R2014a开始,一个类似于Simulink.saveVarsMATLAB 的新功能已被添加到MATLAB中.看到matlab.io.saveVariablesToScript
由于我从 @BHF、@Daniel R 和 @Dennis Jaheruddin 的答案中获得的见解,我设法找到了一个简单的可扩展解决方案:
[fs1, fs2, er] = comp_struct(load('f1.mat'),load('f2.mat'))
Run Code Online (Sandbox Code Playgroud)
请注意,它适用于包含任意数量变量的 .mat。
这使用比较结构-文件交换提交。