首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MATLAB中基于年份的数据分类(单元数组)

MATLAB中基于年份的数据分类(单元数组)
EN

Stack Overflow用户
提问于 2014-08-19 16:17:04
回答 2查看 211关注 0票数 1

假设我们有这个单元格数组的数据:

代码语言:javascript
复制
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}

此单元格数组的最后一列是年份。我希望根据这样的年份对数据(行)进行分类:

代码语言:javascript
复制
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_yearAa_yearB等,或者其他命名,这样我就可以很容易地区分年份,并在下面的代码中用年份调用数据。

我该怎么做?

Thanks.da

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-19 16:58:16

伊瓦尔不在这里指挥。我建议将它保存在这样的结构数组中。

代码语言:javascript
复制
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

看上去是这样

代码语言:javascript
复制
>> 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

此外,您可以轻松地再次访问循环中的struct数组(您不能很容易地使用来完成这些操作)。

代码语言:javascript
复制
>> names=fieldnames(a)

names = 

    'a_2000'
    'a_2006'
    'a_2008'
    'a_2010'

>> for n = 1:numel(names)
    a.(names{n})
end

使用单元格中的字符串进行更新

好吧,假设你的牢房里有字符串

代码语言:javascript
复制
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

结果是一样的,但是您的结构现在是单元格。

代码语言:javascript
复制
>> a

a = 

    a_2000: {2x3 cell}
    a_2006: {3x3 cell}
    a_2008: {'254'  '12'  [2008]}
    a_2010: {2x3 cell}
票数 1
EN

Stack Overflow用户

发布于 2014-08-19 16:27:33

我们可以使用eval很容易地做到这一点。您所做的是首先在第三栏中确定唯一的年份。然后对这些年进行迭代,找出在同一年共享的行,然后使用eval为您提取这些单元格数组,并将它们作为新变量放置。eval是如何工作的,它接受要作为字符串执行的命令。如果我们想要基于某些输入动态运行不同的命令,这是完美的,在您的例子中,这是创建不同的变量名。因此,请尝试这样做,假设a是您指定的创建的单元格数组:

代码语言:javascript
复制
yearColumn = [a{:,3}];
years = unique(yearColumn);
for year = years
    ind = find(year == yearColumn);
    eval(['a_' num2str(year) ' = a([' num2str(ind) '],:);']);
end

因此,执行上述语句将给出以下单元格数组:

代码语言:javascript
复制
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,这就是所谓的相联阵列。在Python中,这些也被称为字典。您要做的是指定一个,所生成的是一个。因此,我们可以使用年份作为,生成的值是单元数组本身。因此,我们可以简单地修改上面的代码,以便使用如下所示的containers.Map

代码语言:javascript
复制
yearColumn = [a{:,3}];
yearArray = containers.Map('KeyType', 'double', 'ValueType', 'any');
years = unique(yearColumn);
for year = years
    yearArray(year) = a(year == yearColumn,:);
end

然后,您可以像这样使用以下年份来访问您的年份:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25388293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档