Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays MATLAB中基于年份的数据分类(单元数组)_Arrays_Matlab_Cell_Cell Array - Fatal编程技术网

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

Arrays MATLAB中基于年份的数据分类(单元数组),arrays,matlab,cell,cell-array,Arrays,Matlab,Cell,Cell Array,假设我们有这个数据单元数组: 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 20

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

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
等。或者其他命名,我可以在下面的代码中区分年份并轻松调用带有年份的数据

我该怎么做


谢谢。da

我们可以很容易地使用。您要做的是首先确定第三列中的唯一年份。然后迭代这些年,找到共享同一年的行,然后使用
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]

根据您的评论,您希望使用,这就是所谓的。在Python中,它们也被称为。您要做的是指定一个,生成的是一个。因此,我们可以使用年份作为,生成的值是单元格数组本身。因此,我们可以简单地修改上述代码,以使用
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]

这里不推荐使用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
看起来是这样

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无法轻松做到的)

在单元格中使用字符串更新 好吧,假设你的牢房里有字符串

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}

我的理解是,您希望使用MATLAB代码将一个单元数组分隔为具有这些变量名称的多个单元数组?是的。这是一个示例命名。也许我们可以找到其他的命名方式,因为我想在几年内轻松调用每一个新的单元阵列。谢谢你的回答。为什么当我删除
'a_'
而只将年份作为输出(命名)时,它会返回如下错误:<代码>错误:等号左侧的表达式不是赋值的有效目标。如何解决此问题?您需要
a
在其中,因为如果删除它,您将被赋值给纯数字的变量,而MATLAB不允许这样做。例如,尝试执行
a_2000=3代码,然后尝试执行
2000=3。这是我无法回答的问题,但如果我们只想用几年的时间来命名如何做到这一点?简单地说,你不能。你能做的就是把它放进一个
容器.Map
,然后以这种方式访问年份。因此,它类似于
a[2000]
,然后您可以通过这种方式访问单元格数组内容。这是你想要的吗?我可以轻松地修改我的答案以使用
容器.Map
。请添加此方法(使用
容器.Map
)。我认为这个想法将完成asnwer。再次感谢。使用结构很好。这很好,但在某些情况下,我在
第1列
第2列
中有字符串,因此我不能使用类似
cell2mat的内容。我想你可以用这些信息编辑这个答案。@user2991243-你为什么不把所有的信息都包括进来,这样我们就不会再猜测自己了?我不知道第三列中的一些值是字符串。在这种情况下,我的方法是完全无效的。你是对的。第三列中没有字符串。在某些情况下,我们在第1列和第2列中有字符串。你的回答是对的,我改变了上面答案中的一些部分。成功了。谢谢。我为这个案例添加了一个非常类似的解决方案,你的手机里有字符串。在这种情况下,你有一个小的开销,因为你需要一行的年份。这就是您需要
tmp.years
tmp.unique\u years
的原因。如果第3列也是字符串,那么对于
tmp.years
,您需要一个
str2double
而不是
cell2mat