扎克 发表于 2012-11-8 18:45

求教 CELL数组排列的问题,cha老大,你怎么看?^0^

本帖最后由 扎克 于 2012-11-8 22:30 编辑

有一组很大的CSV数据,大概8W多行的数据,每个数据为3列,分别是数据名称,时间,值。用Textscan命令之后形成了一个cell数组
其中第一列是名称(cell型),第二列是时间(数值型),第三列是值(因为有些值里有字符,所以为cell型),第四列不需要所以已舍去。

目的:是要把第一列的名称排序,然后在第一列已经排序好的状态下,对第二列时间进行排序,一共有256种不一样的名称。

目前碰到的困难:1.因为是cell数组,所以没办法用sortrows直接进行排序。
                        2.用unique可以取得第一列的排序,问题是没办法对后面2列进行相关排序。

图示:    名称   时间       值
            A      0.01       3
            B      0.02       3
            C      0.03       3
            D      0.04       3
            A      0.05       3
            C      0.06       3
            B      0.06       3
         
要变换成这样:
            A      0.01       3
            A      0.05       3
            B      0.02       3
            B      0.06       3
            C      0.03       3
            C      0.06       3
            D      0.04       3

目前解决不了,请大家帮忙!
PS:之前有人给了这个命令
“ = unique(a(:,1));
    Ausgabe_1 = accumarray(ib, (1:size(a,1))', [], @(x){a(x,:)});”%a就是这个87445*3 cell array数组
排序是排好了,但是每个名称里的时间不能按照升序排序。

rocwoods 发表于 2012-11-9 16:56

楼主你用的哪个版本的MATLAB?我这里可以用sortrows对a排序啊。

扎克 发表于 2012-11-9 17:32

我用的是2006a的版本,,我这里只有这个版本,,真是纠结,,谢谢rocwoods帮忙

扎克 发表于 2012-11-9 17:42

我已经把这些名称都排序好了,然后现在要对这一整段cell进行分段输出,我弄了下列命令:

其中m是每个名称最后出现在这整段cell数组中的Index,比如m(1)=456,m(2)=698,这样,一共有256个名称,m也有256个值。unique_signal是名称的数量。

for i = 1;
signale = final(1:m(i),:);
save('signale.mat','signale')
%end;

for i = 2 : length(unique_signal);
    signale(i)= final((m(i-1)+1):m(i),:);
save('signale.mat','signale(i)');
end;

以上这段程序我运行时知道是错的,但是我想知道怎么样实现它?也就是说怎样在循环中存储256个signale??

rocwoods 发表于 2012-11-10 11:46

比较好奇为什么要分开256个变量存,记录下索引位置,放到一个大cell里存不行吗?

扎克 发表于 2012-11-12 15:30

老师的要求是分开记录,,,,,

rocwoods 发表于 2012-11-12 16:02

扎克 发表于 2012-11-12 15:30 static/image/common/back.gif
老师的要求是分开记录,,,,,

用num2str+eval+save(filename, ..., '-append')处理吧。

扎克 发表于 2012-11-12 20:24

太感谢你的帮助了,recwoods老师。

之前我自己已经把排序都做好了,只是256个名称都在一个cell里,点击cell里的(1,1),便会出现n*3的cell数列,其中第一列是名称。

现在老师让我去掉第一列,只需要第二和第三列,就是时间和值,然后直接保存为矩阵,矩阵名称就是第一列的那个名称。。

于是我又卡住了,因为第二列是数值型,第三列是字符型,没办法直接从cell文件转换为矩阵。。。

而且第一列名称有256项,是变量,如何让这个变量保存为相应的文件名?


这是我目前的程序段,除掉了读入数据的部分:

Zeit = daten{1};%时间
    Signal = daten{2};%信号名称
    Signalwert = daten{3};%信号值
   
    time = num2cell(Zeit); %数值型变为cell型
    a = ; %合并cell

    = sort(Signal);
    final = a(ind,:);       %新数列以时间的大小,升序排列。

    = unique(final(:,1));      %m为此信号最后一次出现在数列中的索引号
   
    signale = cell(256,1);
    for j = 1;
    signale{j} = final(1:m(j),2:3);
    save('signale.mat','signale{j}');
    end;
    for j = 2 : length(unique_signal);
    signale{j} = final((m(j-1)+1):m(j),:);
    save('signale.mat','signale');
    end;

ChaChing 发表于 2012-11-12 22:32

好奇问下, cha老大指的是我吗? 若是, 以后烦请别指名(个人水平/时间有限)
没办法直接从cell文件转换为矩阵? help cell2mat
没实例可试, 对个人而言, 太难又累

扎克 发表于 2012-11-13 14:52

{:{20}:}知道了,,谢谢chaching老师

我再看看cell2mat这个命令,,之前试了下不行
页: [1]
查看完整版本: 求教 CELL数组排列的问题,cha老大,你怎么看?^0^