2015-08-15 426 views
0

我正在寫一些代碼來分割基於第二列中的字符串的180x2的matlab單元數組。該字符串是EP,GA,PS,SS或SA之一。在Python中,我可以定義空列表,然後使用條件來遍歷列表元素並將它們附加到相關列表。在matlab中從單元格數組添加到列表的正確方法?

守則

EP=[]; 
GA=[]; 
PS=[]; 
SA=[]; 
SS=[]; 
for i=1:size(d), 
    if strcmp(d(i,2),'EP'), 
     append(EP,d(i,1)) 
    elseif strcmp(d(i,2),'GA'), 
     append(GA,i) 
    elseif strcmp(d(i,2),'PS'), 
     append(PS,i) 
    elseif strcmp(d(i,2),'SA'), 
     append(SA,i) 
    elseif strcmp(d(i,2),'SS'), 
     append(SS,i) 
    end 
end 

注意,「d」爲我複製並粘貼到MATLAB而非進口一個180x2單元陣列。然而,數據的一般結構爲:

12.9089000000000 'EP' 
13.3697000000000 'SA' 
13.4335000000000 'EP' 
13.5302000000000 'PS' 
13.8434000000000 'EP' 
14.2583000000000 'EP' 
14.8221000000000 'GA' 

然而在MATLAB嘗試這種戰術時,我得到一個錯誤:

Error using append (line 38) 
Wrong number of input arguments for obsolete 
matrix-based syntax. 

Error in Boxplot_All_results (line 12) 
     append(GA,i) 

有人能告訴我在MATLAB這樣做的正確的方式

回答

2

首先,請不要指出d是一個單元陣列。要索引單元陣列的元素,請使用{}。如果您像使用()那樣進行索引,則最終會生成一個只包含索引元素的小單元格數組。

在Matlab中添加你基本上有兩種選擇:

%concatenate the list with a scalar. Also suitable for two lists. 
EP=[EP,d{i,1}] %could also be done using cat 
%append to the end 
EP(end+1)=d{i,1} 

雖然這能解決問題,我建議實施它在一個更通用的方法:

names={'EP','GA','PS','SA','SS'} 
s=struct() 
for idx=1:numel(names) 
    s.(names{idx})=[d{strcmpi(d(:,2),names{idx}),1}] 
end 

您有結束包含你想要的數據的結構。

+1

尼斯觸摸結構。 +1。 (但是在循環中有一個錯字:大寫'S'然後小's') – Hoki

1

你能展示MatLab代碼嗎? 如何將這些值附加到單元陣列?

您可以創建一個a = {} ,然後在size+1索引處追加元素。該操作擴展了您的單元陣列。

或者你也可以做這樣的一招:a = [a; {value}]

0

要添加元素的單元陣列,一個正確的語法是:

for i=1:size(d), 
    if strcmp(d(i,2),'EP'), 
     EP = [EP ; d(i,1) ] ; %// append(EP,d(i,1)) 
    elseif strcmp(d(i,2),'GA'), 
     GA = [GA ; d(i,1) ] ; %// append(GA,i) 

,但有更多的方式,你可以閱讀Add Cells to a Cell Array


也有更多的方法來建立一個分配最終提取的陣列,而不是爲他們成長DYNAM:在文檔中(mlint會通過的方式抱怨)。

獲取滿足條件的元素的索引,然後創建一個只包含匹配元素的數組。例如:

iEP = cellfun(@(c) strcmp(c,'EP') , d(:,2)) ; %// logical array of indexes where the condition is true 
EP = d(iEP,1) ;         %// Create "EP" in one assignment - EP is a [cell] array 

如果你只有數值在這些新的變量進行檢索,可以由具有double數組,而不是cell陣列可以方便:

iGA = cellfun(@(c) strcmp(c,'GA') , d(:,2)) ; %// logical array of indexes where the condition is true 
GA = cell2mat(d(iGA,1)) ;      %// Create "GA" in one assignment - GA is a [double] array 

當然,你可以繞行中間變量保持索引:

PS = d(cellfun(@(c)strcmp(c,'PS'),d(:,2)),1) ;   %// Create "PS" in one assignment [cell] array 
SA = cell2mat(d(cellfun(@(c)strcmp(c,'SA'),d(:,2)),1)) ; %// Create "SA" in one assignment [double] array 
相關問題