MATLAB cell 数组介绍

转载:http://www.matlabsky.com/forum.php?mod=viewthread&tid=21089

由于工作需要,经常要处理大量的实验数据.基本都是由仪器导出来,随着社会发展的进步,人们获取数据的量在不断增长,很多人都是,现在已经是海量数据时代了...



从cell使用说起
在读取文件的时候,cell数组(各种翻译都有,元胞数组,单元数组...直接无视)是Matlab的宠儿,基本都会出现,长期使用发现频率比struct高了不少~无论是Import Data还是使用textscan之类来获取数据.从长期使用高级语言的角度来说,特别是习惯了面向对象之后i,更习惯使用struct数组,概念也很相似,奈何现实是...我们先看一下Matlab在help给出的定义:

A cell array is a collection of containers called cells in which you can store different types of data.

精华之处就是在可以存储不同类型的数据.可以是Matlab的类型或者自定义的类型.



cell数组的一些操作

  • 创建:直接使用{}以及cell(...)形式,另外 下标法赋值也可以.注意后两种可以预配内存,内存是空间连续的~
  • 读取内容:{下标}和(下标)  区别在于类型()是cell数组 ,{}是实际类型.结果显示是一致的
    1. >> a={‘啊‘,123,[3 5 6],[1 2;7 8],sym(1)}
    2. a =
    3. ‘啊‘    [123]    [1x3 double]    [2x2 double]    [1x1 sym]
    4. >> class(a{1})
    5. ans =
    6. char
    7. >> class(a(1))
    8. ans =
    9. cell
    10. >>
    11. C{5,3}{4,7}(:,4)
    12. 解读: cell数组的一个元素为cell类型,包含一个普通矩阵类型
    13. x = C{5,3};      % x is a cell array
    14. y = x{4,7};      % y is also a cell array
    15. z = y(:,4)       % z is a standard array

    复制代码

  • 调整内容:添加和删除与普通矩阵方法一致
  • 相关函数:
  • celldisp:显示所有的内容
  • cell:创建空的元胞数组
  • cellplot:利用图形方式显示内容
  • cell2mat:将数组转变成为普通的矩阵
  • mat2cell:将数值矩阵转变成为cell数组
  • num2cell:将数值数组转变成为cell数组
  • cell2struct:将数组转变成为结构
  • struct2cell:将结构转变为cell数组
  • iscell:判断输入是否为cell数组
  • cellfun:为cell数组的每个cell执行指定的函数 fun可以是特殊函数或者句柄
    1. days{1} = ‘Sunday‘;    days{2} = ‘Monday‘;
    2. days{3} = ‘Tuesday‘;   days{4} = ‘Wednesday‘;
    3. days{5} = ‘Thursday‘;  days{6} = ‘Friday‘;
    4. days{7} = ‘Saturday‘;
    5. shortNames = cellfun(@(x)x(1:3), days, ‘UniformOutput‘, false)
    6. shortNames =
    7. ‘Sun‘    ‘Mon‘    ‘Tue‘    ‘Wed‘    ‘Thu‘    ‘Fri‘    ‘Sat‘

    复制代码

  • deal:将输入参数赋值给输出 [Y1, Y2, Y3, ...] = deal(X{:}) ->可以简化[a,b,c,d] = C{:}

cell数组的类型转换看到上面的那些类型转换函数,也许你会笑了,感觉也没有什么特别的,但是使用过这个cell数组的朋友,估计大部分都会有转换失败的经历-_-很坑爹的...
Cell Array and Struct Array

  • s = cell2struct(c, fields, dim) cell数组转换为struct数组,注意fields为char数组或者cell数组,而且size(c,dim) == length(fields)   % If fields is a cell arraysize(c,dim) == size(fields,1)  % If fields is a char array  这个经常错误就是fields类型以及dim不对
  • c = struct2cell(s)  struct数组转换为cell数组 这个基本没有什么错误的

Matrix and Cell Array c = mat2cell(x, m, n) 转换为 m行n列cell数组 m = cell2mat(c) 必须是同一类型,而且限制不可包含cell数组或object类型,但是struct结构是可以的(同样这个struct不含 cell和object类型,否则依旧出错)
Double and Cell Array C = num2cell(A, [dim1, dim2, ...]) 返回C的维数是numel(A)/prod(X,Y,...)   dimN 是一个整数,范围是1到ndims(A) 只有数值矩阵才可以直接转换为cell,没有供cell转为double的方法.这是非常让人恼火的!不过理解之后就知道,cell本来就是混合类型的,直接转向数值类型单一矩阵,这样是不合理的.通常如果是的确是数值类型的可以走以下路线:cell->cell2mat 这时候注意cell2mat的条件非cell和object.否则,循环或者cellfun处理.如果可以使用 cell2mat 或者cat(dim,c{:}).很多时候都很方便Cell Arrays of Strings 单独列出了是因为很多时候都要接触这个,基本txt之类读取来的数值数据都是char的cell数组~ 可以使用cell参数与字符有关的部分函数(基本都支持)

  • cellstr      Convert a character array to a cell array of strings.会去除末尾空白
  • char        Convert a cell array of strings to a character array. 会恢复转换时候失去的空白
  • deblank   Remove trailing blanks from a string.
  • iscellstr    Return true for acell array of strings.
  • sort        排序.
  • strcat连接字符.
  • strcmp对比字符.
  • strmatch 查找字符.
  • strrep 替换字符
  • regexp系列及accumarray支持行列向量.


读写 数据读取进来了,处理后当然是需要保存的,可是面对要求 你总是很无奈,要是可以.mat格式那个很好啊 可是大部分要求都是txt之类的.(不明白为什么呢 其实数据库之类Matlab也是支持的...唉,需求总是最后的注脚...)首

先要了解怎么情况会有cell数组产生:具体查看textscan 的说明.大文件的读取首先推荐这个函数,处理灵活可以省去很多功夫,具体的格式设置很关键!能够有效分离cell数据的结果方便处理~否则3000万个数据循环绝对是out of memory...尽量使用高级的IO读写...另外,7.0很多读取都是数值返回cell的char类型数组 7.6以上都使用double了,包括xlsread... 如果允许,xlswrite是最好的选择~大量数据测试的结果还是非常好的 在Matlab帮助里面的循环例子:

  1. mycell = { ‘a‘ 1 2 3 ; ‘b‘ 4 5 6 };
  2. [nrows,ncols]= size(mycell);
  3. filename = ‘celldata.dat‘;
  4. fid = fopen(filename, ‘w‘);
  5. for row=1:nrows
  6. fprintf(fid, ‘%s %d %d %d\n‘, mycell{row,:});
  7. end
  8. fclose(fid);

复制代码

仅有数值时候 可以考虑先cell2mat 然后csvwrite.
cellfun的例子可以参考Matlab公司的http://www.mathworks.cn/support/solutions/en/data/1-1190ZB/index.html?solution=1-1190ZB



总结
基本是就是总结了一下用法,特别是转换和保存方面的,相对于struct数组,由于Matlab中支持甚多,因此也就常用了.功能偏弱,但是基本按照规则,还是可以尽量减少出错的.
希望大家也交换一下使用的心得~

时间: 2024-10-24 18:58:21

MATLAB cell 数组介绍的相关文章

matlab cell数组用法

元胞数组: 元胞数组是MATLAB的一种特殊数据类型,可以将元胞数组看做一种无所不包的通用矩阵,或者叫做广义矩阵.组成元胞数组的元素可以是任何一种数据类型的常数或者常量,每一个元素也可以具有不同的尺寸和内存占用空间,每一个元素的内容也可以完全不同,所以元胞数组的元素叫做元胞(cell).和一般的数值矩阵一样,元胞数组的内存空间也是动态分配的. (1)元胞数组的创建 >> a={'matlab',20;ones(2,3),1:10} a = 'matlab'        [         2

matlab cell

cell元包是matlab中提供的一种数据类型,功能强大. 关于cell的创建: 1.跟一般创建举证一样,直接使用C = {A B D E}这种形式,不过这里把"[]"改成了}"{}" 2.使用cell创建cell,C= {C1 C2},这里C1和C2都是cell类型,直接把C1 C2作为一个cell得到的C3是一个1x2的cell数组:使用C3 = [C1 C2],是使用C1和C2的内容来创建cell数组 3.使用cell函数,A=cell(2,2),创建一个空的

16、bash编程之数组介绍

1.程序构成: 主要由指令和数据构成,数据可以是变量.文件.数组 2.数组介绍: 变量:存储单个元素的内存空间 数组:存储多个元素的连续的内存空间 3.数组的特点: 数组名:整个数组只有一个名字 数组索引:元素编号从"0"开始,数组名[索引] 注意:对于bash-4及之后的版本,支持自定义的索引格式,而不仅仅是0,1,2....等等数字格式.同时数组可以不事先声明,可以直接使用,但是如果不声明,它会把多个字符串的变量当做一个变量,因此使用数组前,应先声明数组. 4.声明数组:(有两种方

0长数组介绍

0长数组介绍:也叫柔性数组 用途:为了满足需要变长度的结构体 用法:在一个结构体的最后,申明一个长度为0的数组,就可以实现这个结构体长度的可变,如: typedef struct _Student { int Age; int Length; char Info[0];//0长数组 }Student,*pStudent; 说明: 1.长度为0的数组并不占用空间,sizeof(Student)=8. 2.它只是一个偏移量,数组名这个符号本身代表了一个不可修改的地址常量. 优缺点: 优点:比起在结构

cell数组

 问题: (注意,matlab判断一个数的类型的函数是class(var)) 如果p为一个数,那么h(1)=p,是没有问题的. 如果p为一个向量,那么h(1,:)=p是没有问题的. 如果p是一个矩阵的话,上面的两种赋值方法都是会有错误的. 那么要如何处理呢 ???? 这时就用到了cell数据类型了.cell的每个单元都可以存储任何数据,比如传递函数等.当然,存储矩阵更是没有问题的了.但是用cell数据类型之前,要先初始化. 1.细胞型数据的定义 1)直接赋值定义:细胞型变量在定义时需要使用大括号

matlab 逻辑数组及其应用

这几天学习了matlab的逻辑数组功能,总的感觉就有两点: 第一,通过对原来的数组a进行逻辑判断后得到逻辑数组b 第二,逻辑数组进行某种运算符操作又回到原数组类型 第三,利用逻辑数组mask功能 测试如下: disp('逻辑数组学习及应用'); a = [1 2 3;4 5 6; 7 8 9]; b = a > 4 ;%数组中各个元素与4作比较,逻辑为真则为1 whos 结果: 第二,当执行 c = b + 0后,c 数组为: 第三,它在算术运算中能提供一个屏蔽(mask).屏蔽(mask)是指

js & jquery数组介绍

(转自:http://www.jb51.net/article/30793.htm) 1.数组的创建 var arr=new Array(); 2.查找数组中的元素 for(var i=0;i<arr.length;i++) if(arr[i]==temp) return true; 3.下面比较一下Array和Object的特性: Array: 新建:var ary = new Array(); 或 var ary = []; 增加:ary.push(value); 删除:delete ary

C++实现MATLAB一维数组函数findpeaks()函数求一维离散值极值(波峰波谷)

一.代码 #include <iostream> #include <vector> using namespace std; // //C++实现求一维离散数据极值(波峰.波谷) // //参数:数组,数组大小 void findPeaks(int *num,int count) { vector<int> sign; for(int i = 1;i<count;i++) { /*相邻值做差: *小于0,赋-1 *大于0,赋1 *等于0,赋0 */ int di

Matlab - 求数组的零值与过零点索引

function zeroindex=pickzero(x)%找出数组的零值及过零点(正负相交处,可能偏离0)m = length(x);x1=x(1:m-1);x2=x(2:m);indz = find(x==0); %zero pointindzer = find(x1.*x2<0); %negative/positiven=length(indzer);for i=1:n if abs(x(indzer(i)))>abs(x(indzer(i)+1)) indzer(i)=indzer(