在 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
我正在编写一些代码以根据第二列中的字符串拆分 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