2015-08-15 431 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 
相关问题