为什么不能在for循环中使用对象属性作为索引? (MATLAB)

时间:2011-09-22 19:04:25

标签: oop matlab for-loop indexing

下面是一个在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

3 个答案:

答案 0 :(得分: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.

因此,我认为你想要做的事情是可能的。

答案 1 :(得分:2)

前言:您不应期望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 :(得分:0)

错误是

??? 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提高它。