MATLAB报错:??? Subscripted assignment between dissimilar structures.

在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域。如此就不违背“结构体数组要求它包含的每个结构体都必须有相同的域名以及域名顺序”这一原则了。 


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

原文地址:https://www.cnblogs.com/emituofo/p/2247523.html