2013-10-10 39 views
1

我處理一個Matlab數據結構很是類似「MyCellArray」在下面的示例中的單元陣列內引用的Structs:在Matlab

% Create a Struct of string values inside a Cell Array 
myCellArray = cell(3,1) 
myStruct1 = struct('valA','aaa111','valB','bbb111','valC','ccc111') 
myStruct2 = struct('valA','aaa222','valB','bbb222','valC','ccc222') 
myStruct3 = struct('valA','aaa333','valB','bbb333','valC','ccc333') 
myCellArray{1} = myStruct1 
myCellArray{2} = myStruct2 
myCellArray{3} = myStruct3 

我想能夠有效地提取一些的數據寫入一個新的陣列:

% Extract all valA values from myCellArray  
% ArrayOfValA = myCellArray(< somehow get all the valA values >) 
DesiredResult = cellstr(['aaa111';'aaa222';'aaa333']) % Or something similar 

我是Matlab新手,我只是無法讓我的腦袋周圍的符號。我已經試過了諸如:

ArrayOfValA = myCellArray{(:,1).valA} % This is incorrect notation! 

實際數據超過500K線長,所以我想避免循環或如果可能的話其他的迭代功能。不幸的是,我不能改變原始的數據結構,但我想我可以複製並操作它(我嘗試使用struct2cell,但我陷入了另一個混亂!)。是否有可能以快速有效的方式做到這一點? 非常感謝。

+0

一種方法是這樣的:'cellfun(@(x)(x.valA),myCellArray,'UniformOutput',false)'但是有一個公平的chacne它會比循環慢。而且它肯定仍然是迭代的。 – Dan

回答

0

以下似乎在Octave中工作。我認爲它也適用於MATLAB:

>> temp = {[myCellArray{:}].valA} 
temp = 
{ 
    [1,1] = aaa111 
    [1,2] = aaa222 
    [1,3] = aaa333 
} 
+1

它不工作在matlab據我所知 – Dan

+2

但我認爲你可以這樣做:'temp = [myCellArray {:}]; {temp.valA}'而不是幾乎一樣好 – Dan

0

是否

myCellAsMat = cell2mat(myCellArray); 
ArrayOfValA = vertcat(myCellAsMat(:).valA); 

工作?

編輯:或horzcat,取決於valA字段的尺寸和所需輸出。