【问题标题】:Why can't you use a object property as an index in a for loop? (MATLAB)为什么不能在 for 循环中使用对象属性作为索引? (MATLAB)
【发布时间】:2011-09-22 19:04:25
【问题描述】:

下面是一个在 Matlab 中不起作用的示例,因为 obj.yo 被用作 for 循环的索引。你可以把它转换成等效的while循环,它工作正常,那为什么Matlab不让这段代码运行呢?

classdef iter_test
    properties
        yo = 1;
    end
    methods
        function obj = iter_test
        end
        function run(obj)
            for obj.yo = 1:10
                disp('yo');
            end
        end
    end
end

【问题讨论】:

    标签: oop matlab for-loop indexing


    【解决方案1】:

    前言:您不应该对 Matlab 的 oop 功能抱有太多期望。尽管 matlab > 2008a 的情况有所好转,但与真正的编程语言相比,Matlab 中的 oop 支持非常差。 根据我的经验,Mathworks 试图尽可能地保护用户免于犯错。这有时也意味着他们限制了可能性。 看看你的例子,我相信同样的事情正在发生。

    可能的答案: 由于 Matlab 没有任何显式类型(变量/参数是即时键入的),您的代码可能会遇到问题。想象一下:

    $ a = iter_test()
    % a.yo is set to 1
    
    % let's overwrite 'yo'
    $ a.yo = struct('somefield', [], 'second_field', []);
    % a.yo is now a struct
    

    因此以下代码将失败:

    $ for a.yo
         disp('hey');
      end
    

    我敢打赌,如果 matlab 支持输入参数/变量,您的代码就可以正常工作。但是,由于您可以在初始化后为参数/变量分配完全不同的数据类型,因此编译器不允许您做您想做的事情,因为您可能会遇到麻烦。

    【讨论】:

      【解决方案2】:

      来自帮助

      “属性就像结构对象的字段。”

      因此,您可以使用属性来读取/写入它。但不要像您尝试做的那样将其用作变量。当你写

         for obj.yo = 1:10
                      disp('yo');
          end
      

      那么 obj.yo 被用作变量,而不是字段名称

      与实际的结构用法进行比较以使其更清晰:

      EDU>> s = struct('id',10)
      for s.id=1:10
          disp('hi')
      end
      
      s = 
      
          id: 10
      
      ??? for s.id=1:10
               |
      Error: Unexpected MATLAB operator.
      

      但是,可以将结构字段“设置”为新值

      EDU>> s.id=4
      s = 
          id: 4
      

      将上述错误与您得到的错误进行比较:

      ??? Error using ==> iter_test
      Error: File: iter_test.m Line: 9 Column: 20
      Unexpected MATLAB operator.
      

      因此,我不认为您尝试做的事情是可能的。

      【讨论】:

        【解决方案3】:

        错误是

        ??? Error: File: iter_test.m Line: 9 Column: 20
        Unexpected MATLAB operator.
        

        表示 MATLAB 解析器不理解它。我会让你决定这是一个错误还是故意的。通过 TMW 技术支持提出。

        编辑:这也适用于所有其他类型的下标:

        以下都解析失败:

        a = [0 1];
        for a(1) = 1:10, end
        
        a = {0 1};
        for a{1} = 1:10, end
        
        a = struct('a', 0, 'b', 0);
        for a.a = 1:10, end
        

        这是 MATLAB 解析器的问题。用 Mathworks 提高它。

        【讨论】:

        • 是的,我收集到解析器不理解它......问题是为什么。这根本不是我的问题的答案。
        • 我不同意。回答“为什么我做不到?”是“MATLAB 目前不支持它”。问题真的是“为什么 MATLAB 不支持这个?”
        • 哦,你能不能停止对你不喜欢的答案投反对票,而不是对没有帮助的答案投反对票。
        • 显然 MATLAB 不支持这一点,因为它会引发错误;这是在问题中假设的,因此您的回答完全没有帮助。
        • 那有什么问题呢?无论如何,如果您认为有问题,我的回答是向 Mathworks 提出。
        猜你喜欢
        • 2021-08-14
        • 2017-11-15
        • 2020-02-26
        • 2019-02-10
        • 2013-12-21
        • 1970-01-01
        • 2019-07-03
        • 2020-12-16
        相关资源
        最近更新 更多