声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2345|回复: 9

[编程技巧] 求教 CELL数组排列的问题,cha老大,你怎么看?^0^

[复制链接]
发表于 2012-11-8 18:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
本帖最后由 扎克 于 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:之前有人给了这个命令
“[e,f,ib] = unique(a(:,1));
    Ausgabe_1 = accumarray(ib, (1:size(a,1))', [], @(x){a(x,:)});”  %a就是这个87445*3 cell array数组
排序是排好了,但是每个名称里的时间不能按照升序排序。
回复
分享到:

使用道具 举报

发表于 2012-11-9 16:56 | 显示全部楼层
楼主你用的哪个版本的MATLAB?我这里可以用sortrows对a排序啊。

评分

1

查看全部评分

 楼主| 发表于 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??
发表于 2012-11-10 11:46 | 显示全部楼层
比较好奇为什么要分开256个变量存,记录下索引位置,放到一个大cell里存不行吗?
 楼主| 发表于 2012-11-12 15:30 | 显示全部楼层
老师的要求是分开记录,,,,,
发表于 2012-11-12 16:02 | 显示全部楼层
 楼主| 发表于 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 = [Signal,time,Signalwert]; %合并cell

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

    [unique_signal,m,n] = 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;
发表于 2012-11-12 22:32 | 显示全部楼层
好奇问下, cha老大指的是我吗? 若是, 以后烦请别指名(个人水平/时间有限)
没办法直接从cell文件转换为矩阵?
help cell2mat
没实例可试, 对个人而言, 太难又累
 楼主| 发表于 2012-11-13 14:52 | 显示全部楼层
知道了,,谢谢chaching老师

我再看看cell2mat这个命令,,之前试了下不行
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-15 22:38 , Processed in 0.072417 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表