【问题标题】:Matlab: How to remove the error of non-existent fieldMatlab:如何消除不存在字段的错误
【发布时间】:2012-11-25 12:34:46
【问题描述】:

运行 matlab 代码时出现错误。在这里,我尝试使用以前代码的输出之一作为新代码的输入。

??? Reference to non-existent field 'y1'.

谁能帮帮我?

【问题讨论】:

    标签: matlab


    【解决方案1】:

    一个好的做法可能是在访问之前检查该字段是否存在:

    if isfield( s, 'y1' )
        % s.y1 exists - you may access it
        s.y1
    else
        % s.y1 does not exist - what are you going to do about it?
    end
    

    考虑到 Edric 的评论,另一种可能的方式是

    try 
        % access y1
        s.y1
    catch em
        % verify that the error indeed stems from non-existant field
        if strcmp(em.identifier, 'MATLAB:nonExistentField')
             fprintf(1, 'field y1 does not exist...\n');
        else
             throw( em ); % different error - handle by caller?
        end
    end
    

    【讨论】:

    • 很遗憾,在这里使用 try/catch 实际上更快。
    【解决方案2】:

    您是否使用命令 load 从文件中加载数据? 如果是,则此函数会覆盖您当前的变量,因此,它们将不存在,因此当您调用时,它不会使用:

    load ('filename');
    

    使用:

    f=load ('filename');
    

    现在,要引用加载文件中的任何变量,请使用 f.varname,例如 例如,如果在加载的数据中保存了一个名为 net 的网络,您可以像这样使用它:

    a = f.net(fv);
    

    【讨论】:

      【解决方案3】:

      我会先说明我的情况,然后给出解决方案。

      • 我先保存一个变量op,它是一个struct,它的名字是coef.mat
      • 我使用coef = load( file_path, '-mat') 加载这个变量;
      • 在一个新函数中,我将变量coef作为参数传递给它,这里弹出错误Reference to non-existent field

      我的解决方案:

      • 只需将coef 替换为coef.op,然后将其传递给函数即可。

      所以,我认为背后的原因是:struct 被保存为一个变量,当你使用load 并想要访问 origin 变量时,你需要直接用dot(.)操作指出来,可以直接在Matlab工作区打开变量,看看它在变量里面包裹了什么。

      在您的情况下,如果您的 先前代码的输出 是一个结构(这是我的猜测,但您没有指出)并且您将其保存为 MyStruct,则将其加载为MyInput = load(MyStruct)那么当作为函数的参数使用时,应该是 MyInput.y1.

      希望它会起作用!

      【讨论】:

        【解决方案4】:

        首先将其加载到命令窗口并观察工作区窗口。您可以看到结构名称。它将通过访问结构名称来工作。示例:

        lm=load('data.mat');
        disp(lm.SAMPLE.X);
        

        这里 SAMPLE 是结构名称,X 是结构的成员

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-06-11
          • 2018-06-28
          • 1970-01-01
          • 2011-05-02
          • 1970-01-01
          • 1970-01-01
          • 2014-08-26
          相关资源
          最近更新 更多