2012-03-18 30 views
2

我想要這個(數組=向量):如何在Matlab中創建載體中包含的結構域的投影?

array.Select(elem => elem.my_field).ToArray(); // C# + Linq 
array map _.my_field // Scala, I believe 

在普通的英語,我有載體。每個元素都是結構。每個結構都有字段(任何類型)。現在,我不想擁有這個,我想擁有「領域」的矢量。

例子:

所以,如果一開始我有姓名+年齡結構(參見下面的更新)的載體,我想創建投影,所以我最終隨着年齡的載體(年齡的順序) 。

我試過arrayfun功能,但是這給了我錯誤:

error: cellfun: all values must be scalars when UniformOutput = true

我懷疑這是環境設置,但我不能切換的,因爲我的代碼將在陌生的環境中運行。

更新:我簡化了這個例子,我很抱歉 - 年齡是一個數字,但不時它是一對數字。所以在一般情況下,我必須假設它可以是任意長度的數字的向量(正如我在Matlab中理解的,一個數字是vector.length = 1)。

問題

如何讓這樣的 「組合拳」 投影在Matlab?

回答

3

您可以使用cat到鏈狀您的數組:

s = struct('age',{10 20 20},'name',{'Bob','Max','Peter'}) 
1x3 struct array with fields: 
    age 
    name 

age = cat(1,s.age) 
age = 
    10 
    20 
    20 

如果你想使用arrayfun,你會做到以下幾點:

age = arrayfun(@(x)x.age,s); 

編輯

要鏈狀一個結構的字段長度未知,有兩種選擇:如果你只想要所有的「年齡」, 「#年齡」#5最終在6號位並不重要,因爲「年齡」#2有兩個條目,您沿着所有「年齡」 - 陣列長度相同的維度鏈接。舉例來說,如果他們都1x1的1x2的還是1×3或陣列等,你寫

age = cat(2,s.age); 

或者,如果你希望你的輸出數組元素#2有兩個條目(因爲s(2).age有兩個條目) ,你鏈狀成CELL ARRAY

age = {s.age}; 

(以括號訪問)的age每個元素是1x1單元陣列,它可以包含任何類任何大小的陣列;要訪問單元格數組元素的內容,請使用大括號:age(2)是單元格數組的第二個元素,age{2}是所述元素的內容,即您的1x2數字數組。

+0

謝謝,我恐怕我簡化了我的問題太多了,因爲當我運行你的代碼時,它在我的情況下不起作用,因爲我不時只是數字(年齡)而不是數字(年齡)的數字)。如何處理這種情況? – greenoldman 2012-03-18 13:24:02

+1

@macias:或者沿着不同的維度鏈接,或者創建一個單元格數組。看我的編輯。 – Jonas 2012-03-18 13:36:53

+0

Yuppi !!! :-)它工作非常好,非常感謝你,並再次抱歉,這種簡化。 – greenoldman 2012-03-18 13:56:15

相關問題