在 matlab 中从元胞数组添加到列表的正确方法?

Correct way of adding to a list from cell array in matlab?

我正在编写一些代码以根据第二列中的字符串拆分 180x2 matlab 元胞数组。此字符串是 EP、GA、PS、SS 或 SA 之一。在 python 中,我可以定义空列表,然后使用条件循环遍历列表的元素并将它们附加到相关列表。

代码

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' 是一个 180x2 元胞数组,我将其复制并粘贴到 matlab 而不是导入。然而,数据的一般结构是:

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 中执行此操作的正确方法吗

首先,请不要说 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

您最终得到一个包含所需数据的结构。

你能展示一下 MatLab 代码吗? 如何将这些值附加到元胞数组?

你可以只创建一个 a = {} 然后在 size+1 索引处追加元素。该操作扩展了您的元胞数组。

或者你也可以这样做:a = [a; {value}]

要将元素追加到元胞数组,正确的语法是:

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


还有更多方法可以在一次作业中构建最终提取的数组,而不是让它们动态增长(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