14

2 つの .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')

ここをクリックするとb、違いがわかります。しかし、これを実行して「ファイル > 保存」を使用すると、b. そのため、何が変更されたのかはまだわかりません。

注: Simulink を持っていません


したがって、私の質問は次のとおりです。

Matlab を使用していない人に 2 つの mat ファイルのすべての違いを表示するにはどうすればよいですか?


私が個人的にさまざまな状況に最も適していると考える答えは次のとおりです。

4

7 に答える 7

8

MATLAB を使用せずに、mat ファイル間のすべての違いを見つけますか?

HDF5 Toolsを使用して、HDF5ベースの.mat ファイルの違いを見つけることができます。

MATLAB の例を短くして、2 つのマット ファイルを作成すると仮定します。

clear ; a = 6 ; b.c = 'hello' ; save -v7.3 f1
clear ; a = 7 ; b.e = 'world' ; save -v7.3 f2

MATLAB 以外での使用

h5ls -v -r f1.mat

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

の使用

h5ls -d -r f1.mat

格納されたデータの値を返します。

/                        Group
/a                       Dataset {1, 1}
    Data:
        (0,0) 6
/b                       Group
/b/c                     Dataset {5, 1}
    Data:
        (0,0) 104, 101, 108, 108, 111

データ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)}'

f2.mat の同じリストを取得し、選択したツールで 2 つの出力を比較できます。

比較はHDF5 ツールでも直接機能します。a両方のファイルの 2 つの数値を比較するには、次を使用します。

h5diff -r f1.mat f2.mat /a

値とその違いが表示されます

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

備考

HDF5 Toolsにはさらにいくつかのコマンドとオプションがあり、実際の問題を解決するのに役立つ場合があります。

The HDF Groupから Linux および Windows 用のバイナリ ディストリビューションを入手できます。OS X の場合、 MacPorts経由でインストールできます。必要に応じて、GUI: HDFViewもあります。

于 2013-10-11T19:24:47.060 に答える
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')

このスクリーンショットに示されているように

ここに画像の説明を入力

デフォルトでは、配列の要素数が 1000 に制限されており、10000 まで増やすことができることに注意してください。その制限を超える配列は、別の mat ファイルに保存されます。

更新: R2014a から、に似た新しい関数Simulink.saveVarsが MATLAB に追加されました。見るmatlab.io.saveVariablesToScript

于 2013-10-02T11:46:18.297 に答える
3

XML ファイルを比較するための優れたツールがいくつかあります。これを次のように進めます。

  1. struct2xml.m をダウンロード
  2. 両方の matfile を読み込む
  3. それぞれを struct2xml でエクスポートします
  4. XMLSpy などを使用して比較する
于 2013-10-16T20:50:04.033 に答える
2

値の違いを表示しない、単純な一般的な回答

@BHF、@Daniel R、@Dennis Jaheruddin の回答から得た洞察のおかげで、シンプルでスケーラブルなソリューションを見つけることができました。

[fs1, fs2, er] = comp_struct(load('f1.mat'),load('f2.mat'))

任意の数の変数を含む .mat に対して機能することに注意してください。

これはCompare Structures - File Exchange サブミッションを使用します。

于 2016-05-03T09:03:13.430 に答える
1

値の違いを表示しない一般的な回答

@BHF と @Daniel RI の回答から得た洞察のおかげで、合理的にスケーラブルなソリューションを見つけることができました。

ステップ 1: 各ファイルのすべての変数を単一の構造体として保存する

これは、保存ワークスペースを使用して構造化 - ファイル交換送信を行います。

f1.matとを比較する場合の手順は次のf2.matとおりです。

clear
load f1
myStruct1 = ws2struct;
save myStruct1 myStruct1 
clear
load f2
myStruct2 = ws2struct;
save myStruct2 myStruct2 
clear                    
load myStruct1
load myStruct2

ステップ 2: 構造体を比較する

これはCompare Structures - File Exchange サブミッションを使用します

比較myStruct1したい場合、次のようにmyStruct2簡単に呼び出すことができます。

[fs1, fs2, er] = comp_struct(myStruct1,myStruct2)

の違いのリストがどれほど読みやすいかに、私は積極的に驚きましerた。質問で使用された例の出力は次のとおりです。

えー=

's2 is missing field a'
's1(1).b(1).c(1).e and s2(1).b(1).c(1).e do not match'

値が表示されないことに注意してください。技術的な観点から、値の差の表示が望ましい場合、m ファイルを変更することはおそらくそれほど難しくありません。ただし、特にいくつかの大きな行列がある場合、これにより問題のある出力が発生する可能性があると思います。

于 2013-10-18T09:35:49.390 に答える