图片缩略图

比较结构

version 2.0.0.0 (6.6 KB) by 迈克尔arant
递归地比较两个结构化变量,并注意两个结构的不同之处。
4.7
41评级

38下载

更新2015年8月30日

视图版本历史

查看许可协议

这是一个全新的工具版本,基于朋友给我的关于如何让它更有用的评论,它提供了新的功能。建议是让应用程序以结构形式报告两个结构之间的共同内容和每个结构的独特内容——本质上,解析输入结构。列表输出现在使用一个单独的应用程序(list_sruct)执行。所以要比较两个结构,请使用comp_struct。要展开(解包)结构,请在每个输出上使用list_struct。这对于解决Brad Stiritz、David Groppe和David Provencher指出的问题也有很长的路要走。
如有需要,将旧代码作为参考。
__________________
2013年10月19日
这是对代码的更新,以便提供遇到的错误的更好列表。之前重写的明显限制在于数据的后期处理(感谢Brad Stiritz和Brett Shoelson提供的关于如何解决这个问题的有用评论)。新代码本质上是相同的算法(对记录错误的方式做了一些小的改变),但是增加了一个新的错误评估算法。这里最大的困难是管理结构不匹配的潜在组合。例如,代码可能会遇到以下问题:
A.a是类double, b.a是类char
A.b存在,b.b不存在
A(2)存在,b(2)不存在
A.c和b.c是同一类,但内容不同
A.d和b.d都是函数(甚至是相同的函数),但在不同的点进行计算
A.e是一个子结构,而b.e是一个double, char, cell, ....

新的输出试图通过开发一个有N行(用于N个错误)和3列(错误标签、结构1内容和结构内容)的单元格来管理所有这些组合。

注意:调用语法已经改变(新的输出变量),所以它不是前面代码的直接更新。如果当前正在使用前面的脚本,则需要更新调用函数。

_______________________________________
2013年4月29日
这是对代码的重新编写,利用MATLAB中的新功能,因为我在10年前编写了第一个版本。最初的版本只是我在绝望中写的东西,不是很优雅。这个版本应该更有用。原始版本包括为子孙后代。

调用语法与原始的类似,但现在你可以:
1.禁用所有屏幕打印输出,只打印缺失的字段,打印所有错误,或打印所有错误和匹配。
2.激活一个等待进度的工具条(如果你没有打印出错误并且你的结构比较大的话)
3.将所有错误收集到单个单元格中(而不是每个结构两个单元格)
4.结构顺序并不重要。工具查找匹配的字段。

感谢Brian的建议和验证测试。感谢David Groppe提供的错误输出建议。感谢David Provencher关于只输出的建议。感谢Keith Beardmore指出了排序顺序问题。
_______________________________________
原来的帖子:

结构化变量有利于组织数据和操作数据。然而,它们很难检查出错误或差异。函数允许将结构中的每个字段与单独结构中的相应字段进行检查。可能的结果是:
1.字段一致(存在并且具有相同的内容)
2.字段不一致(两者都存在,但内容/值不同)
3.字段仅存在于一种结构中
4.字段类型不同(变量类不一致)

引用作为

迈克尔arant(2021)。比较结构(//www.tatmou.com/matlabcentral/fileexchange/22752-compare-structures), MATLAB中央文件交换。检索

意见及评分(47

KAE

有用的

Xingwang勇

谢谢,完美!

Anjaneyula Korapu

我可以在我的工作中使用这个来做垫子原木的比较吗?

有执照吗?我不明白这里的条款。有人能简化一下吗?

马修·马蒂

非常好的文档,有用,并节省了我很多时间。谢谢你!

Otavio Trentin

谢谢你的代码!!

西蒙的艺术

非常有用!谢谢你!

Toolman Thoolen

布拉姆

如果您想接受nan值相等,请将此代码包含在“% the same?”

nan_pass = 0;
If isnumeric(s1) && isnumeric(s2) && length(s1) == 1 && length(s2) == 1
If isnan(s1) && isnan(s2)
nan_pass = 1;
结束
结束

并将下面的if语句直接更改为
If ~isequal(s1,s2) && n_pass == 0

HiWave

塞尔吉女仆Pedrosa

如此有用和节省时间!

莱昂内尔Trebuchon

详细的和有用的。谢谢。

卢卡斯斯特尔

肯购买

非常有用!我发现使用list_struct(m,1)列出完整的差异是很有价值的,但我不得不修改它来抑制大矩阵的显示。我将第56行改为:
disp (s1 (1: min(最终,10),1:min(最终,10),1:min(最终,10),1:min(最终,10)))
(在这种情况下,这种方法只适用于4维以下的矩阵)

Mdaatniel

对不起,这是虚假的0/5评级,有人吗,请取消这个0/5评级。

comp_struct工作非常好。在评论中打错了“parent”。

我更喜欢让printf相同,因此我将"common =[];"替换为"common = fprintf();",并在底部添加以下几行:

函数res =流(变长度输入宗量)
持久errormessage
如果输入参数个数> 0;
errormessage = [{sfprintf(变长度输入宗量{:})},变长度输入宗量);
res = [];
其他的
res = errormessage;
结束

Mdaatniel

对不起,这是虚假的0/5评级,有人吗,请取消0/5评级。

Mdaatniel

majid sadeghi

非常感谢。

马修·菲利普斯

谢谢,兄弟,这节省了我的时间。

亨瑞克

Stefan Grandl

艾米丽Yunha胫骨

亚历山大Tumlinson

省了我不少时间,谢谢。

亚历山大Tumlinson

我喜欢它,

我在第196行做了一个小更改,以便waitbars指示您在流程中的位置。

如果(pse)
waitmsg={['比较' n1 '和' n2 '....'];'[空格]步骤如果暂停'};
其他的
waitmsg=['比较' n1 '和' n2 '....'];
结束
如果wbf;世行= waitbar (0, waitmsg);结束

如果等待栏交错出现在屏幕上就太好了。目前,结构的深度似乎没有被显式传递。我觉得你可以从名字语法中提取出来?

克里斯多夫

现在我第一次打开了函数,我看到它已经完成了。

这就是我急着发邮件的下场。

迈克尔arant

谢谢汤米。事实上,早期的版本确实有这样的除法。但当你需要比较0和0(或数字噪声)时,它就崩溃了……

汤米

好工具!

我建议改一下线路
呃=规范(s1-s2);

呃=规范(s1. / s2-1);

如果我比较一个结构,只包含参数值,那么使用相对错误是有意义的。

比较5e-12和4e-12不应该是公差匹配。

问候,
汤米

佩德罗·德雷尔

这节省了我很多时间。谢谢你!

奥斯丁

这很有帮助。谢谢你的贡献。

布拉德Stiritz

非常有用的功能,但消息输出不利于机器处理。如果有一个选项只返回不匹配的字段名本身,将会很有帮助。

我没有选择修改函数代码,而是编写了一个helper函数,从输出消息中提取字段名。以下是核心逻辑,希望对某些人有所帮助。

% {
下面是来自comp_struct()的消息输出示例:

> > st_1。NAME = ' abc ';
> > st_2。NAME =“def”;
> > [~, cv_st_1_msgs] = comp_struct (st_1 st_2 0, 0, 0, "、",0)
cv_st_1_msgs = '(1)。NAME与(1).NAME不匹配

我们想从这个字符串中提取'NAME'。使用免费的Expresso工具,我
开发了一个正则表达式来捕获“NAME”的第一次出现。
%}

%声明正则表达式从comp_struct()中捕获字段名
%消息输出:
正则表达式 = '\(.*\)\.(.*)\ 沙的;

%对所有comp_struct输出字符串应用(regex) &返回捕获组作为包含令牌匹配的双嵌套单元向量的(N x 1)单元向量。
cv_cv_cv_fieldnames =正则表达式(regex cv_messages,“令牌”);

% Preallocate输出:
cv_fieldnames =细胞(N_fields, 1);

%遍历regexp()输出:
对于i_field = 1: N_fields

% Assign (i)'第一个输出元素:
cv_fieldnames {i_field} = cv_cv_cv_fieldnames {i_field} {1} {1};
结束

迈克尔arant

Brian:你在函数句柄问题上是正确的。我从没想过要这样的结构。似乎这个工具应该进行彻底的改革.....

布莱恩

谢谢,省了我一些时间。
它将无法比较某些类型的结构数据。如果结构的字段包含函数句柄,或各种类型的simulink对象。金宝app故障通常发生在第151行,因为没有为所有数据类型定义减法操作符。

大卫Provencher

非常有用的。想要一个'silent'选项来禁用命令窗口的输出,并且只对大型结构使用输出变量。

马丁

马丁

谢谢,-)

马修·克丽玛

太好了。像其他人一样,这个功能为我节省了时间。

基思·比尔德莫尔

谢谢-节省了我的时间。
我的字段在两个结构中的顺序不同,所以我必须重新排序一个:comp_struct(s1,orderfields(s1,s2))。

便雅悯

这个脚本节省了我几个小时的时间……谢谢

Jdh

Jaime Undurraga

很好

Florian Dignath

真的非常感谢!* * * * *
抱歉打扰了评级,我的评级总是消失的瞬间,我点击提交。在MS IE和Firefox中都可以。

基督教Komposch

迈克尔arant

谢谢你大卫:
升级的时候我会记住的。我打算使用pause命令来标记不匹配的情况。还有" er "输出。当我有机会时,我将添加一个额外的输入来关闭所有结构字段的回声。

大卫Groppe

谢谢!很有帮助。
如果您可以添加一个选项,使函数只显示不匹配的内容,那就太好了。对于我正在处理的应用程序来说,显示所有匹配的信息太多了。

罗兰·费斯

是的,非常有用。谢谢!

低音

Shadi

非常适合我!谢谢

MATLAB版本兼容性
创建R2012a
与任何版本兼容
平台的兼容性
窗户 macOS Linux

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!