2012-01-30 32 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