如何使用for循环命名数据数组中的变量

时间:2015-01-06 16:53:34

标签: arrays matlab variables for-loop

我在数组中有一个数组,我试图使用for循环命名变量,因为有很多变量。当我使用以下简单代码Time1 = dataCOMB{1,1}{1,1}(1:1024, 1);时,它打开数组中的第一个单元格并继续打开以下数组中的第一个单元格,最后将第1行第1行到第1024行中的所有值定义为Time1 。但是,当我应用以下代码时,我有38个这些不同的数据集:

for t = 1:38
    for aa = 1:38
        Time(t)  = dataCOMB{1,1}{1,aa}(1:1024, 1);
    end
end

我收到错误

  

在作业A(I)= B中,B和I中的元素数必须相同。

     

Load_Files_working中的错误(第39行)
     时间(t)= dataCOMB {1,1} {1,aa}(1:1024,1);

基本上我想让matlab调用每个数据集Time1Time2等的第一列。

2 个答案:

答案 0 :(得分:1)

问题:

1)你想在单元格行中提取......

2)...第1列中的前1024个数字......

3)...来自细胞阵列的前38个细胞中的每一个。

计划:

1)如果想要从单元格数组的每个元素(即通过{}索引访问的数组)获取信息,可以使用cellfun。致电cellfun(some_function, a_cell_array)会汇总some_function(a_cell_array{k})所有可能k下标的结果。如果结果是异构的(即不具有相同的类型和大小),可以使用cell_fun(..., 'UniformOutput', false)选项将它们放入输出单元阵列中(单元阵列擅长将异构数据分组在一起)。

2)要从数字数组x的第一列中提取前1024个数字,可以使用此匿名函数:@(x) x(1:1024,1)x参数将来自单元格数组的每个元素,我们的匿名函数将在上面的步骤中扮演some_function的角色。

3)现在我们需要指定a_cell_array,即包含目标的前38个单元格的单元格数组。那就是dataCOMB{1,1}(1,1:38)

解决方案:

这个单线实施计划:

Time = cellfun(@(x) x(1:1024,1), dataCOMB{1,1}(1,1:38), 'UniformOutput', false);

然后您可以像在此示例中那样访问您的数据:

this_time = Time{3};

答案 1 :(得分:0)

您的错误是Time(t)。这不是你在matlab中创建一个新变量的方式。要做到你想要的(即创建变量名称Time1Time2等等......你需要使用eval函数:

for aa = 1:38
    eval(['Time' num2str(aa) '= dataCOMB{1,1}{1,aa}(1:1024,1);']);
end

许多人不喜欢推荐eval功能。其他人不建议将所有数据从数据结构中移出并放入他们自己独立命名的变量中。因此,为了解决这两个批评,更好的选择可能是将数据从复杂的数据结构中拉出来并将其放入更简单的数组中:

Time_Array = zeros(1024,38);
for aa = 1:38
    Time_Array(:,aa) = dataCOMB{1,1}{1,aa}(1:1024,1);
end

或者,如果你不喜欢它,因为你真的喜欢名字Time1Time2等,你可以将它们创建为数据结构的字段:

Time_Data = [];
for aa = 1:38
    fieldname = ['Time' num2str(aa)];
    Time_Data.(fieldname) = dataCOMB{1,1}{1,aa}(1:1024,1);
end

并且,为了回复原始帖子下面的评论,可以扩展此方法以进一步解压缩数据:

Time_Data = [];
count = 0;
for z = 1:2;
    for aa = 1:38
       count = count+1;
       fieldname = ['Time' num2str(count)];
       Time_Data.(fieldname) = dataCOMB{1,z}{1,aa}(1:1024,1);
    end
end