MATLAB右侧元素数量不正确

时间:2014-07-03 21:50:53

标签: matlab data-structures matrix multidimensional-array

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)),'右手的数目不正确..'错误信息在这里被解雇。

任何人都可以为我解决这个问题吗?

1 个答案:

答案 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  

非标量结构的Pro

使用非标量结构可以执行的操作是在所有子结构中检索一个字段(考虑到您没有遇到串联问题):

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]);