2014-12-05 24 views
1

我想爲真實世界的問題創建一個模擬並使用面向對象的編程。Matlab ObjectOrientated Programming Vectorize

比如我有一個這樣的類:

classdef person 
    properties 
    name  % string 
    age  % integer 
    height % double (was called 'size' before - which might be a bad idea, see post below) 
    end 
end 

現在一個人我可以

p1 = person; 

創建和

p1.name = 'Karl'; 
p1.age = 35; 
p1.size = 1.80; 

所以我們必須給它的屬性一個名叫卡爾的個人,年齡35歲,身高1.80米。

我現在想要的是矩陣,例如我有一個島的matrix1,其中0的所有條目都是水,並且所有條目都是1代表土地。現在我想隨機隨地填充這些土地,以至於無處不在,matrix1的「土地」在哪裏可以放置personmatrix2,其他的都是0。

第一個:有沒有一種方法來實現這一點?如何快速創建這樣的矩陣,而不是通過兩個for-loop元素來初始化這個元素?

第二:然後,我怎麼能夠訪問數據? (如old_ppl = matrix2(person.age >= 50)

+0

第一個直覺,如果你想能夠引導對一系列對象的操作,你將不得不創建一個personCollection對象,它可以收集所有這些人,並且在這個集合類中實現一個方法,該方法可以接受/處理向量化的輸入/輸出。 – Hoki 2014-12-05 10:49:55

+0

** first **你想要一個隨機排序的0,1矩陣嗎?如果是這樣,只需生成一個隨機矩陣'A = rand(1000)'返回一個1000x1000的矩陣,其值從0變爲1.現在你做'A(A <0.5)=0;A(A> = 0.5)= 1;'你得到一個隨機矩陣爲0,1。現在用你的第二個矩陣......你想讓這些人隨機放置在你的「土地」上嗎?你是否有足夠的人來填充一個完全是矩陣的矩陣?畢竟不太可能,但可能。 – 2014-12-05 10:50:18

+0

是的,他們應該隨機放在土地 – user3079834 2014-12-06 09:19:04

回答

2

首先認識到,你不能有一個數組,其中的一些元素是person類和一些元素是0 - 如果它是一個數組,那麼所有的元素都必須同班同學

你可以使用單元格數組(而不是數組)來完成這個操作,這對你來說是一個解決方案。

另一種方式是創建一個抽象類AbstractPerson,從matlab.mixin.Heterogeneous繼承,然後有兩個子類RealPersonNullPersonAbstractPerson繼承。通過這種方式,您將能夠構建一個類AbstractPerson的數組,其中包含類RealPersonNullPerson的元素在正確的位置。這對你來說是另一種解決方案。我不確定你的例子是玩具問題還是現實世界問題;對於玩具問題,這種方法幾乎肯定是一個巨大的矯枉過正,但對於現實世界的問題,它可能不是。

您可以非常簡單地矢量化上述任一解決方案的構建。

但是,這些解決方案都不是真的非常有效,因爲它們沒有真正利用MATLAB的優勢。而不是嘗試構建一個包含Person對象的數組,而不是嘗試相反的方式來構建一個包含數組的對象People

例如:

classdef People 
    properties 
     names % nxm cell array of strings 
     ages % nxm array of integers 
     heights % nxm array of heights 
    end 
end 

(NB筆記,我已經叫物業height,而不是size - 這是在MATLAB一個非常糟糕的主意來命名任何size,因爲這是一個非常基本的內置功能)。

namesagesheights只會是空字符串或NaN,如果沒有人在場。如果你願意,你可以有一個額外的屬性isPresent這是一個nxm邏輯陣列,你可以用它來方便地管理有或沒有人的位置。爲了確保陣列之間的一致性,使他們SetAccess = private,並給它一個方法addPerson(name, age, height, position)同時確保陣列留在規模和類等

一致,將在正確的位置添加一個人那將是更加有效和利用MATLAB的優勢。

+0

我編輯我的帖子,是的,這是一個現實世界的問題,'isPresent'屬性是一個好主意。我會在本週末嘗試一些東西,看看什麼會最適合。謝謝,你實際上可以幫我一下:) – user3079834 2014-12-06 09:26:01