2012-03-31 32 views

答えて

19

isequalまたはisequalwithequalnans機能を使用してください。コード例:

s1.field1 = [1 2 3]; 
s1.field2 = {2,3,4,{5,6}}; 
s2 = s1; 
isequal(s1,s2) %Returns true (structures match) 

s1.field3 = [1 2 nan]; 
s2.field3 = [1 2 nan]; 
isequal(s1, s2)    %Returns false (NaN ~= NaN) 
isequalwithequalnans(s1, s2) %Returns true (NaN == NaN) 

s2.field2{end+1}=7; 
isequal(s1,s2)    %Returns false (different structures) 

isequal(s1, 'Some string') %Returns false (different classes) 
+5

@ user1131467:構造体に 'NaN'が含まれている場合、' isequal'は構造体が類似していると考えても 'false'を返すことがあります。したがって、isequalの代わりにisequalwithequalnansを使用することをお勧めします。 – Jonas

+0

@Jonasそれは良い点です。私は答えを編集しました。 – Pursuit

+3

R2012bでは['isequaln'](http://www.mathworks.com/help/matlab/ref/isequaln.html)を使用してください。 –

2

私はメンバーの属性のすべての定期的な比較を行う関数isStructEqual(struct1,struct2)を書くでしょう。そのような比較が「偽」または「0」を返す場合は、すぐに終了して「偽」を返します。そうでない場合は、それを起こさないメンバー属性のリストをすべて通過する場合はtrueを返します。構造体が非常に大きい場合は、メンバーフィールドの反復処理を自動化する方法があります。

中央のファイル交換を見ると、this fileを試してみるかもしれません。

+0

これは言語や標準ライブラリの一部として実装されていない何らかの理由はありますか?かなり基本的な機能のように思えます。 –

+0

おそらく、さまざまな構造変数の複雑な比較をサポートしたくないからです。私はすべてがメンバー属性であることが分かりませんが、シンボリック変数やツールボックス固有のオブジェクトなどが構造体フィールドとして追加された場合はどうなりますか?他の誰かが適切なツールボックスを持っていないと、問題が発生する可能性があり、それはMathworksの人々にとっては優先順位の低い頭痛になるかもしれません。私はそのようなことのためにMathworksの大ファンではありません。別の言語で作業したいと思うオプションがあれば、NumPyでPythonを検討してください。 – ely

+1

もちろん、残念ながら、オクターブは必須です。もし私が自分のやり方を持っていれば、C++、stl、おそらくは、Armadilloのような数学ライブラリを増強したいと思うでしょう:http://arma.sourceforge.net/ –

関連する問題