Matlab的语法令人愤怒,特别是结构。在Bioinformatics工具包中,有一个名为jcampread(File)的方法,其描述为here。
在描述中,方法jcampread()接受一个Filepath并输出到一个名为jcampStruct的结构中。根据我的理解,在Matlab中,你没有像在C中那样声明返回变量类型:你只是给返回变量一个名字,它以某种方式知道jcampread()方法的返回将是一个jcampStruct。怎么做,我不知道,但确实如此。
我完全按照示例部分的步骤4中的代码显示了代码,我从Matlab返回以下错误消息:
Incorrect number of right hand side elements in
dot name assignment. Missing [] around left hand
side is a likely cause.
Error in jcampread>ntupleRead (line 510)
dataBlock.ZName = name{Zidx};
Error in jcampread (line 192)
dataBlocks = ntupleRead(fid);
This网站说“当f有多个矩阵元素时”会出现问题。代码如下:
»f.a = [1 0]
f =
a: [1 0]
»f.b = [1 2]
f =
a: [1 0]
b: [1 2]
»f = setfield(f,'a',[2 2])
f =
a: [2 2]
b: [1 2]
»f(2).a=1
f =
1x2 struct array with fields:
a
b
»f = setfield(f,'a',[2 2])
??? Error using ==> setfield
Incorrect number of right hand side elements in dot name assignment.
Missing [] around left hand side is a likely cause.
我认为这意味着矩阵f看起来像这样:
f = [ [a1; b1]; [a2; b2]; ]
f = [ [[2 2]; [1 2]]; [[1]; []]; ]
当他们尝试更新设置为
的f.a时 f.a = [[2 2]; [1]]
...对于单个元素[2 2],它不喜欢它,因为f.a当前是具有2个向量元素的矩阵。基本上,如果要重新分配f.a(矩阵f的属性a的所有元素),则必须重新分配f.a以使其具有与当前具有相同数量的元素。
我认为这就是setfield示例中出现此错误的原因。
我的问题:这如何适用于jcampread()? jcampStruct实际上是一个具有相同属性的结构,这些属性只分配一次。我不明白:
一个。 matlab如何知道jcampread()的返回值是一个jcampStruct,和 湾为什么(鉴于它知道(a)),'右手的数目不正确..'错误信息在这里被解雇。
任何人都可以为我解决这个问题吗?
答案 0 :(得分:3)
您正在创建一个非标量结构,并且无法一次性分配,即没有循环,为每个子结构的相同字段赋予不同的值。这是什么意思?
s.a = 1;
size(s)
ans =
1 1
现在,添加字段不会改变结构的大小:
s.b = 2;
size(s)
ans =
1 1
但是,为相同字段指定一个值,但将其分配到一个位置> 1结构,将增长为非标量:
s(2).a = 3
size(s)
ans =
1 2
另外,请注意位置2中的子结构如何复制/预分配初始结构的字段,即使您已单独分配到a
:
s(2)
ans =
a: 3
b: []
此外,字段s(2).b
只是一个空指针:
whos s
Name Size Bytes Class
s 1x2 496 struct
并通过添加标量double(8字节),我们得到
s(2).b = 4;
whos s
Name Size Bytes Class
s 1x2 608 struct
使用非标量结构可以执行的操作是在所有子结构中检索一个字段(考虑到您没有遇到串联问题):
for ii = 1:100
s(ii).a = rand(1,2);
end
cat(1,s.a)
最后一个命令会将所有子结构中单个字段的所有值连接成一个100乘2的数组。
要在子结构中分配不同的值,即使是相同的字段,也需要循环(如上所述for loop
)。
最多可以将deal()
个相同的值放入所有子结构的一个字段中:
clear s
[s(1:100)] = deal([1, 2]);