【问题标题】:MATLAB Incorrect number of right hand side elementsMATLAB 右侧元素的数量不正确
【发布时间】:2014-07-03 21:50:52
【问题描述】:

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)),“右手数不正确..”错误消息在这里触发。

谁能帮我解决这个问题?

【问题讨论】:

  • 只是一个站点注释:Matlab 中没有嵌套数组。 [ [a1; b1]; [a2; b2]; ] 是另一种写法[ a1; b1; a2; b2; ]
  • 您也不能创建不均匀的矩阵。因此,当您尝试更新矩阵时,f.a 所拥有的内容将不起作用,因此您提到的内容确实是正确的。另外,尝试直接分配f.a = ... 而不是使用setfield

标签: matlab data-structures matrix multidimensional-array


【解决方案1】:

您正在创建一个非标量结构,并且无法一次分配,即没有循环,给每个子结构的同一字段分配不同的值。这是什么意思?

标量结构

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  

通过添加一个双精度标量(8 个字节),我们得到 ​​p>

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 x 2 数组中。

缺点

要跨子结构分配不同的值,即使是同一个字段,也需要循环(如上面for loop)。

您最多可以deal() 将相同的值放入所有子结构的一个字段中:

clear s
[s(1:100)] = deal([1, 2]);

【讨论】:

  • 所有这一切都非常棒,但我仍然觉得我不明白为什么会为 jcampread(); 抛出这个错误;你有机会看看这个方法吗?我在上面发布的链接中有一个示例 .DX 文件。感谢您对 Matlab 运算符的深入回复!
  • @areyoujokingme 您需要发布产生错误的代码的 sn-p。其实可能是文件没找到,或者文件不规范。
  • 嘿,奥列格。在我的第一段中,我给出了这个地址的链接:mathworks.com/help/bioinfo/ref/jcampread.html。我使用的确切代码是#4 中的代码(向下滚动)。我会附上我正在使用的 DX 文件,但由于法律问题,我不能。但是,我的 DX 文件包含相同的通用格式,但比他们非常简单的 DX 文件示例更复杂。
  • 我开始担心这是一个版本的东西。我认为 jcampread() 仅适用于 ISAS 版本 5 DX 文件,不适用于 Bruker 版本 6 DX 文件,这是我目前正在运行的。嘎。我认为这是关于 Matlab 的。
  • @areyoujokingme 您可以尝试放置一个断点并在调试模式下检查发生了什么。此外,您可以向 TMW 提交请求以使其与较新版本兼容(但请注意,文档说他们支持“JCAMP-DX 格式的 4.24、5 或 6 版”)。因为我没有那个工具箱,所以我无能为力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-19
  • 1970-01-01
相关资源
最近更新 更多