2012-01-30 31 views
2

我试图找到下列情况很好的解决方案:寻址数据阵列从类get函数返回在Matlab

我有一个类:

classdef SomeClass < handle 

    properties (Access = private) 
     x 
    end 

    methods 
     function x = getX(this) 
      x = this.x; 
     end 
    end 
end 

x - 一些数据阵列。 我是否有可能解决阵列的一些元素,好像我做它的结构:

struct.x(5) 

还是我总是要做到这样?:

myClassObj = SomeClass(); 
x = myClassObj.getX(); 
x(5) 

或创造一些FUNC getXAt?

+0

为什么属性为'private'但定义了getX()?你想让'x'可读但不能被其他类写吗?这个类的所有属性都是相同大小的数组吗? – 2012-01-30 16:57:20

+0

因为我曾经用Java编程,不确定这是以这种方式执行它的好方法:) – Lex 2012-01-31 07:25:25

回答

2

是。像这样寻址就是Matlab对象中属性的正常行为。您只需将该媒体资源展示出来,而不是将其完全投放到private

classdef SomeClass < handle 

    properties (SetAccess=private) 
     x 
    end 

    methods 
     function obj = SomeClass(x) 
      obj.x = x; 
     end 
    end 
end 

然后你可以像一个结构体上的字段来处理它。

>> sc = SomeClass(1:7); 
>> sc.x(5) 
ans = 
    5 
>> 

在Matlab中不需要像在Java中一样创建自己的存取器函数。您可以独立控制使用属性的属性的读取和写入权限。如果您想要更复杂的属性访问逻辑,则可以使用特殊的function out = get.x(obj)语法定义getter和setter,并且它们的行为将适用于使用obj.x语法完成的属性访问。

+0

谢谢。我正在考虑,但不确定 – Lex 2012-01-31 07:25:59

1

在Matlab中,任何类都是数组的类。

因此,你可以写这样你的类:

classdef SomeClass < handle 

    properties (Access = private) 
     x 
    end 

    methods (Access=public)   
     function this = SomeClass(x) 
      this.x = x; 
     end 
    end 

    methods 
     function x = getX(this)     
      x = [this.x]; 
     end 
    end 
end 

,并获得这样的:

S(1)= SomeClass的(1);
s(2)= SomeClass(5);
s(3)= SomeClass(6);

s.getX()

ANS =

1  5  6 

S(2).getX()

ANS =

5 
+0

称这为“矢量化”是误导。将对象元素间的数据字段拆分实际上会阻止您在字段上进行矢量化操作,而无需先进行昂贵的阵列重建。可能是正确的设计,但“矢量化”可能是错误的术语。以前版本的Matlab doco称这是一个“结构有组织的”类,而不是“平面有组织的”类。 – 2012-01-30 17:48:00

+0

@AndrewJanke,好点! – 2012-01-30 17:49:32

+0

@Andrey,谢谢你的提示。我不知道。但对于我的情况,我认为这不是一个完美的方式,因为在我的情况下,x可能相当大,而且我们需要大量的对象。 – Lex 2012-01-31 07:21:19