假设我们有这个数据单元格数组:
a={43 432 2006;
254 12 2008;
65 35 2000;
64 34 2000;
23 23 2006;
64 2 2010;
32 5 2006;
22 2 2010}
此单元格数组的最后一列是年。我希望根据以下年份对数据(行)进行分类:
a_2006 = {43 432 2006;
32 5 2006;
32 5 2006}
a_2008 = {254 12 2008};
a_2000 = {65 35 2000;
64 34 2000}
a_2010 = {64 2 2010;
22 2 2010}
我在每个单元格数组的第三列中有不同的年份(此单元格数组是一个示例)所以我想要一个自动方法来确定年份并将它们分类为a_yearA
,a_yearB
等。其他命名,我可以在以下代码中轻松区分多年并轻松调用数据。
我该怎么做?
Thanks.da
答案 0 :(得分:1)
我们可以使用eval
轻松完成此操作。您所做的是首先确定第三列中的唯一年份。然后迭代这些年,查找同一年共享的那些行,然后使用eval
为您提取这些单元格数组并将它们作为新变量放置。 eval
的工作原理是它将要执行的命令作为字符串执行。如果我们想要根据某些输入动态运行不同的命令,这是完美的,在您的情况下创建不同的变量名称。因此,尝试这样做,假设a
是您指定的已创建单元格数组:
yearColumn = [a{:,3}];
years = unique(yearColumn);
for year = years
ind = find(year == yearColumn);
eval(['a_' num2str(year) ' = a([' num2str(ind) '],:);']);
end
执行上述语句因此给出了以下单元格数组:
a_2000 =
[65] [35] [2000]
[64] [34] [2000]
a_2006 =
[43] [432] [2006]
[23] [ 23] [2006]
[32] [ 5] [2006]
a_2008 =
[254] [12] [2008]
a_2010 =
[64] [2] [2010]
[22] [2] [2010]
根据您的评论,您希望使用containers.Map
,这就是所谓的associative array。在Python中,这些也称为dictionaries。您所做的是指定键,生成的是值。因此,我们可以将年份用作键,并且生成的值是单元格数组本身。因此,我们可以简单地修改上面的代码,以便像containers.Map
那样使用:
yearColumn = [a{:,3}];
yearArray = containers.Map('KeyType', 'double', 'ValueType', 'any');
years = unique(yearColumn);
for year = years
yearArray(year) = a(year == yearColumn,:);
end
然后您可以使用年份来访问您的年份:
yearArray(2000)
ans =
[65] [35] [2000]
[64] [34] [2000]
yearArray(2006)
ans =
[43] [432] [2006]
[23] [ 23] [2006]
[32] [ 5] [2006]
yearArray(2008)
ans =
[254] [12] [2008]
yearArray(2010)
ans =
[64] [2] [2010]
[22] [2] [2010]
答案 1 :(得分:1)
这里不推荐使用eval。我建议将它保存在像
这样的结构数组中a={43 432 2006;
254 12 2008;
65 35 2000;
64 34 2000;
23 23 2006;
64 2 2010;
32 5 2006;
22 2 2010};
tmp = cell2mat(a);
% clear a or take another variable name for your struct to prevent warnings
clear a
years=unique(tmp(:,3));
for n = 1:numel(years)
a.(['a_' num2str(years(n))])=tmp(tmp(:,3)==years(n),:);
end
看起来像那样
>> a
a =
a_2000: [2x3 double]
a_2006: [3x3 double]
a_2008: [254 12 2008]
a_2010: [2x3 double]
>> a.a_2000
ans =
65 35 2000
64 34 2000
此外,您可以再次循环访问结构数组(使用eval hack可以轻松完成这些操作)。
>> names=fieldnames(a)
names =
'a_2000'
'a_2006'
'a_2008'
'a_2010'
>> for n = 1:numel(names)
a.(names{n})
end
好吧,说你的单元格中有字符串
a={'43' '432' 2006;
'254' '12' 2008;
'65' '35' 2000;
'64' '34' 2000;
'23' '23' 2006;
'64' '2' 2010;
'32' '5' 2006;
'22' '2' 2010};
% save original variable 'a' for accessing later
tmp.cell = a;
% save just the years in a matrix for more easy accessing + we need the
% indizes for getting the values from the cell later in the loop
tmp.years = cell2mat(a(:,3));
% clear variable a or take another variable name for your struct to prevent warnings
clear a
% get unique years for iteration
tmp.unique_years=unique(tmp.years);
for n = 1:numel(tmp.unique_years)
a.(['a_' num2str(tmp.unique_years(n))])=tmp.cell(tmp.years==tmp.unique_years(n),:);
end
结果是一样的,但你的结构现在是单元格
>> a
a =
a_2000: {2x3 cell}
a_2006: {3x3 cell}
a_2008: {'254' '12' [2008]}
a_2010: {2x3 cell}