• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

MATLAB报错:???Subscriptedassignmentbetweendissimilarstructures.

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

在MATLAB中使用结构体数组时,有时会报错” ??? Subscripted assignment between dissimilar structures.”。下面来看两种常见的情况:

1. 向结构体数组中,添加不同结构的元素时:

假如你有两套联系方式。一套是完整的联系方式包括Phone,Email,QQ。
Contact1:
      Phone: 8008800
      Email: ****@*****
      QQ: 123456789
另一套只有一个备用的Phone。
Contact2:
      Phone: 8008801
这时你可以在MATLAB中建立一个结构体数组保存这两套联系方式。先定义两套联系方式:

Contact1.Phone='8008800';
Contact1.Email='****@*****';
Contact1.QQ='123456789';
Contact2.Phone='8008801';

再把Contact1和Contact2加到Contacts这个结构体数组中。先加Contact1,

Contacts(1)=Contact1;

再加Contact2,

Contacts(2)=Contact2;

这时候就会报错“??? Subscripted assignment between dissimilar structures.”。
这是为什么呢?原来,结构体数组要求它包含的每个结构体都必须有相同的域名以及域名顺序
相同的域名很好理解,那什么叫相同的域名顺序?试验一下下面的建立结构体的方式,你就知道了。

Contact1.Phone='8008800';
Contact1.Email='****@*****';
Contact1.QQ='123456789';
Contact2.Phone='8008801';
Contact2.QQ=[];
Contact2.Email=[];
Contacts(1)=Contact1;
Contacts(2)=Contact2;

这里Contact1和Contact2有相同的域名,但是域名顺序并不同,同样会报错。
所以,正确建立结构体的方式:

Contact1.Phone='8008800';
Contact1.Email='****@*****';
Contact1.QQ='123456789';
Contact2.Phone='8008801';
Contact2.Email=[];
Contact2.QQ=[];
Contacts(1)=Contact1;
Contacts(2)=Contact2;

当然你也可以省去中间变量,这样写:

Contacts(1).Phone='8008800';
Contacts(1).Email='****@*****';
Contacts(1).QQ='123456789';
Contacts(2).Phone='8008801';

这里未对Contacts(2)的Email和QQ赋值,是可以的,MATLAB会对未赋值的域填入空阵列(即[])。


2. 删除结构体数组中某个元素的某个域时:

现在假设你的两套联系方式都是完整的。那么可以建立一个1*2的结构体数组Contacts:

Contacts(1).Phone='8008800';
Contacts(1).Email='***1@*****';
Contacts(1).QQ='123456789';
Contacts(2).Phone='8008801';
Contacts(2).Email='***2@*****';
Contacts(2).QQ='987654321';

过了几天,你的QQ987654321被盗了,那么你想把第两套联系方式的QQ部分删除,以免误人子弟。你这样做:
Contacts(2)=rmfield(Contacts(2),'QQ');
这时候就会报错“??? Subscripted assignment between dissimilar structures.”。
原因上面已经分析了:结构体数组要求它包含的每个结构体都必须有相同的域名以及域名顺序。假如删除了Contacts(2)的QQ域,Contacts(1)和Contacts(2)的域名就不相同了。
那怎么做呢?很简单:

Contacts(2).QQ=[];

又过了几天,倒霉的你QQ123456789又被盗了,你很郁闷,不过还要把第一套联系方式的QQ部分删除。你可以这样做:

Contacts(1).QQ=[];

也许你会说:“两个QQ都不能用了,那Contacts 里还留着QQ域有什么用?删掉算了!“。怎么删呢?刚才不是说不能删吗?
其实是可以删的。这样做:

Contacts=rmfield(Contacts,'QQ');

这样的操作,是同时删除了Contacts(1)和Contacts(2)的QQ域。如此就不违背“结构体数组要求它包含的每个结构体都必须有相同的域名以及域名顺序”这一原则了。 


总结:好吧,扯了半天,总结起来就一句话:结构体数组要求它包含的每个结构体都必须有相同的域名以及域名顺序


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Delphi高手突破第二章(3),封装,继承,多态发布时间:2022-07-18
下一篇:
delphi使用FoxitQuickPDFLibrary读写pdf文本和图片发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap