Octave/MATLAB:如何比较结构体是否相等?

20

在Octave(或Matlab)中,我该如何比较两个struct是否相等?

尝试使用==运算符会产生以下结果:

binary operator `==' not implemented for `scalar struct' by `scalar struct' operations
2个回答

24

可以使用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
如果结构体中包含NaN,即使我们认为这些结构体是相似的,isequal可能会返回false。因此,我建议使用isequalwithequalnans代替isequal。 - Jonas
4
在R2012b中使用isequaln - b3.

2
我会写一个叫做isStructEqual(struct1,struct2)的函数,来对所有成员属性进行常规比较。如果任何一次比较返回'false'或'0',那么立即退出并返回'false',否则,如果成功遍历完所有成员属性而没有发生这种情况,则返回true。如果结构体非常大,则有自动迭代成员字段的方法。
在中央文件交换上查看,你可以尝试这个文件

这个功能为什么不作为语言或标准库的一部分实现呢?它似乎是相当基本的功能。 - Andrew Tomazos
可能只是因为他们不想支持各种结构变量的复杂比较。我不确定什么可以成为成员属性,但如果像符号变量或工具箱特定对象之类的东西被添加为结构字段会怎样。如果其他人没有正确的工具箱,这可能会导致问题,这可能只是Mathworks公司的一个低优先级的头痛问题。我不是Mathworks的粉丝,因为有这样的事情。如果您有选择使用另一种语言并且希望这样做,请考虑使用带有NumPy的Python。 - ely
1
很不幸,这门课要求使用Octave。如果由我决定,我会选择使用C++、STL,也许还有Boost和像Armadillo这样的科学数学库:http://arma.sourceforge.net/ - Andrew Tomazos
+1 给前端链接。我最近也写了一个类似的函数。 - yuk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接