找到.mat文件之间的所有差异

Den*_*din 14 diff matlab file mat-file

我正在寻找一种方法来列出两个.mat文件之间的差异,这对许多人来说都是有用的.

虽然我搜遍了我能想到的任何地方,但我找不到任何符合我要求的东西:

  1. 选择2个垫文件
  2. 找出差异
  3. 妥善保存它们

我最接近的是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文件之间的所有差异


以下是我个人认为最适合不同情况的答案:

BHF*_*BHF 8

找到没有MATLAB的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.


Moh*_*nia 5

如果你有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

  • 我在阅读这个答案之后才提到我缺乏Simulink.因此,不要仅仅因为这个原因而投票. (2认同)

use*_*828 3

简单的一般答案,不显示价值差异

由于我从 @BHF、@Daniel R 和 @Dennis Jaheruddin 的答案中获得的见解,我设法找到了一个简单的可扩展解决方案:

[fs1, fs2, er] = comp_struct(load('f1.mat'),load('f2.mat'))
Run Code Online (Sandbox Code Playgroud)

请注意,它适用于包含任意数量变量的 .mat。

这使用比较结构-文件交换提交