解释下Matlab中matlab的cell2matt函数是怎样排列转换后数据的顺序的

第2章_MATLAB数据及其运算_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
第2章_MATLAB数据及其运算
上传于||暂无简介
大小:2.07MB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢9752人阅读
matlab(24)
谈谈MATLAB中cell函数
如果p为一个数,那么h(1)=p,是没有问题的。
如果p为一个向量,那么h(1,:)=p是没有问题的。
如果p是一个矩阵的话,上面的两种赋值方法都是会有错误的。
那么要如何处理呢?
这时就用到了cell数据类型了。cell的每个单元都可以存储任何数据,比如传递函数等。当然,存储矩阵更是没有问题的了。但是用cell数据类型之前,要先初始化。
a=cell(n,m)
那么就把a初始化为一个n行m列的空cell类型数据。
如何赋值呢?
a{1,1}=rand(5)
那么a的1行1列的单元中存储的就是一个随机的5&5的方阵了。
那么要用第一个单元中的方阵中的某个值呢?
可以如下引用:a{1,1}(2,3)
就可以了,引用cell单元时要用{},再引用矩阵的某个数据就要用()了。
cell单元中的每个单元都是独立的,可以分别存储不同大小的矩阵或不同类型的数据。
下面举个例子:
a=cell(2,2);%预分配a{1,1}='cellclass';a{1,2}=[1 2 2];a{2,1}=['a','b','c'];a{2,2}=[9 5 6];&& a{1,1}ans =cellclass&& a{1,2}ans =&&&&&1&&&&&2&&&&&2&& a{2,:}ans =abcans =&&&&&9&&&&&5&&&&&6&& b=a{1,1}b =cellclass
元胞数组:
&&& 元胞数组是MATLAB的一种特殊数据类型,可以将元胞数组看做一种无所不包的通用矩阵,或者叫做广义矩阵。组成元胞数组的元素可以是任何一种数据类型的常数或者常量,每一个元素也可以具有不同的尺寸和内存占用空间,每一个元素的内容也可以完全不同,所以元胞数组的元素叫做元胞(cell)。和一般的数值矩阵一样,元胞数组的内存空间也是动态分配的。
&&&& (1)元胞数组的创建
&& a={'matlab',20;ones(2,3),1:10}
&&& 'matlab'&&&&&&& [&&&&&&&& 20]&&& [2x3 double]&&& [1x10 double]
&& b=[{'matlab'},{20};{ones(2,3)},{1:10}]
&&& 'matlab'&&&&&&& [&&&&&&&& 20]&&& [2x3 double]&&& [1x10 double]
&& c(1,2)={2}
&&& [10]&&& [2]
&& c(2,2)={5}
&&& [10]&&& [2]&&&&& []&&& [5]
&& isequal(a,b)
&& whosName&&&&& Size&&&&&&&&&&& Bytes Class&&&&& Attributes
a&&&&&&&& 2x2&&&&&&&&&&&&&& 388 cell&&&&&&&&&&&&&&&&&ans&&&&&& 1x1&&&&&&&&&&&&&&&& 1 logical&&&&&&&&&&&&&&b&&&&&&&& 2x2&&&&&&&&&&&&&& 388 cell&&&&&&&&&&&&&&&&&c&&&&&&&& 2x2&&&&&&&&&&&&&& 208 cell&&&
用cell函数创建元胞数组,创建的数组为空元胞。cell函数创建空元胞数组的主要目的是为数组预先分配连续的存储空间,节约内存占用,提高执行效率。&&&&
&& a=cell(1)
&& b=cell(1,2)
&&&& []&&&& []
&& c=cell(3,3)
&&&& []&&&& []&&&& []&&&& []&&&& []&&&& []&&&& []&&&& []&&&& []
&& d=cell(2,2,2)
d(:,:,1) =
&&&& []&&&& []&&&& []&&&& []
d(:,:,2) =
&&&& []&&&& []&&&& []&&&& []
&& whosName&&&&& Size&&&&&&&&&&&& Bytes Class&&&&& Attributes
a&&&&&&&& 1x1&&&&&&&&&&&&&&&&& 4 cell&&&&&&&&&&&&&&&&&ans&&&&&& 1x1&&&&&&&&&&&&&&&&& 1 logical&&&&&&&&&&&&&&b&&&&&&&& 1x2&&&&&&&&&&&&&&&&& 8 cell&&&&&&&&&&&&&&&&&c&&&&&&&& 3x3&&&&&&&&&&&&&&&& 36 cell&&&&&&&&&&&&&&&&&d&&&&&&&& 2x2x2&&&&&&&&&&&&&& 32 cell&&&
&& (2)元胞数组的数据获得
&&& 从元胞数组中读取数据,可保存为一个标准的数组或一个新的单元数组,或取出数组进行计算。元胞数组中数据的访问,可通过元胞内容的下标进行,用元胞数组名加大括号{}。大括号中数值表示元胞的下标。如a{1,2}表示元胞数组中第一行第二列的元胞。
&& a={20,'matlab';ones(2,3),1:3}
&&& [&&&&&&& 20]&&& 'matlab'&&&&&&& [2x3 double]&&& [1x3 double]
&& str=a(1,2)
&&& 'matlab'
&& class(str)
&& str=a{1,2}
&& class(str)
()和{}有着本质的区别,大括号用于表示元胞的内容,小括号表示指定的元胞。
&&& [&&&&&&& 20]&&& 'matlab'&&&&&&& [2x3 double]&&& [1x3 double]
&& a{2,1}(2,2)
&&& 0.9134
&& a{2,1}(2,3)
&&& 0.0975
&& a{1,2}(2)
使用元胞的下标,可将一个元胞数组的子集赋值给另一个变量,创建新的元胞数组。
&& a=[{1},{2},{3};{4},{5},{6};{7},{8},{9}]
&&& [1]&&& [2]&&& [3]&&& [4]&&& [5]&&& [6]&&& [7]&&& [8]&&& [9]
&& b=a(2:3,2:3)
&&& [5]&&& [6]&&& [8]&&& [9]
&& c=a(1:3,2:3)
&&& [2]&&& [3]&&& [5]&&& [6]&&& [8]&&& [9]
&&&& 本例使用元胞下标的方式创建了新的元胞数组b和c,通过结果看出b和c就是元胞数组a的一部分。
&&&& (3)元胞数组的删除和重塑
&&&& 要删除单元数组中的行或列,可以用冒号表示单元数组中的行或列,然后对其赋一个空矩阵即可。
a={20,'matlab';ones(2,3),1:3}
&&& [&&&&&&& 20]&&& 'matlab'&&&&&&& [2x3 double]&&& [1x3 double]
&& a(1,:)=[]
&&& [2x3 double]&&& [1x3 double]
&& a={20,'matlab';ones(2,3),1:3};&& a{1}=[]
&&&&&&&&&&&&& []&&& 'matlab'&&&&&&& [2x3 double]&&& [1x3 double]
&& a(1)=[]
&&& [2x3 double]&&& 'matlab'&&& [1x3 double]
&& a(2)=[]
&&& [2x3 double]&&& [1x3 double]
&& a(1,2)=[]??? A null assignment can have only one non-colon index.
&& a(1)=[]
&&& [1x3 double]
&&&& 元宝数组和其他数组一样,也可以通过reshape函数改变形状,改变后的元胞数组与原元胞数组的元素个数相同,不能通过改变形状来添加或删除元胞数组中的元素。
&& a=cell(4,4)
&&&& []&&&& []&&&& []&&&& []&&&& []&&&& []&&&& []&&&& []&&&& []&&&& []&&&& []&&&& []&&&& []&&&& []&&&& []&&&& []
&& size(a)
&&&& 4&&&& 4
&& b=reshape(a,2,8)
&&&& []&&&& []&&&& []&&&& []&&&& []&&&& []&&&& []&&&& []&&&& []&&&& []&&&& []&&&& []&&&& []&&&& []&&&& []&&&& []
&& size(b)
&&&& 2&&&& 8
&&&&& (5)元胞数组中的操作函数
&&&&& cell:创建空的元胞数组
&&&&& cellfun:为元胞数组的每个元胞执行指定的函数
&&&&& celldisp:显示所有元胞的内容
&&&&& cellplot:利用图形方式显示元胞数组
&&&&& cell2mat:将元胞数组转变成为普通的矩阵
&&&&& mat2cell:将数值矩阵转变成为元胞数组
&&&&& num2cell:将数值数组转变成为元胞数组
&&&&& deal:将输入参数赋值给输出
&&&&& cell2struct:将元胞数组转变成为结构
&&&&& struct2cell:将结构转变为元胞数组
&&&&& iscell:判断输入是否为元胞数组
&& a={20,'matlab',3-7i;ones(2,3),1:3,0}
&&& [&&&&&&& 20]&&& 'matlab'&&&&&&& [3.0000 - 7.0000i]&&& [2x3 double]&&& [1x3 double]&&& [&&&&&&&&&&&&&& 0]
&& b=cellfun('isreal',a)
&&&& 1&&&& 1&&&& 0&&&& 1&&&& 1&&&& 1
&& c=cellfun('length',a)
&&&& 1&&&& 6&&&& 1&&&& 3&&&& 3&&&& 1
&& d=cellfun('isclass',a,'double')
&&&& 1&&&& 0&&&& 1&&&& 1&&&& 1&&&& 1
(函数的应用)
&&& cellfun函数的主要功能是对元胞数组的元素(元胞)分别指定不同的函数,不过,能够在cellfun函数中使用的函数ushuliang是有限的。&&
&&& 能在cellfun中使用的函数:
&&& isempty:若元胞元素为空,则返回逻辑真
&&& islogical:若元胞元素为逻辑类型,则返回逻辑真
&&& isreal:若元胞元素为实数,则返回逻辑真
&&& length:元胞元素的长度
&&& ndims:元胞元素的维数
&&& prodofsize:元胞元素包含的元素个数
&&& (7)元胞数组的嵌套
&&& 元胞数组的元胞中包含其他的元胞数,称为嵌套元胞数组,没有嵌套结构的元胞则称为页元胞。使用嵌套的大括号或cell函数,或直接用赋值表达式,都可以创建嵌套单元数组,另外还可以访问嵌套元胞数组的子数组、元胞或元胞的元素。
&& a=cell(1,2)
&&&& []&&&& []
&& a(1,2)={cell(2,2)}
&&&& []&&& {2x2 cell}
&&&&& && a(1,1)={magic(3)};a{1,2}(1,1)={[1 2 3;4 5 6;7 8 9]};a{1,2}(2,1)={[2-i;4+7i]};a{1,2}(2,2)={cell(1,2)};a{1,2}{2,2}(2)={5};&& cellplot(a)
&&&&& (8)元胞数组与数值数组间的转化
&&&&& 应用循环,可以将元胞数组转化为数值数组。
  最近完成模式分类的作业,需要大量使用matlab,期间发现了一个问题,是matlab代码的复用程度。
  在面向过程编程里, 基本的复用单位是函数,程序的复杂度籍此下放到函数的接口上。设计好函数间的接口,基本上就成功了一半。在面向对象编程里, 基本的复用单位是对象,对象使得数据具有了一定程度的自维护。而在matlab里, 我很长时间都没有找到方向,因为我搞不清楚复用的单位是什么。
  matlab中,基本的单位是矩阵,针对矩阵系统有一大堆的函数供你调用。但是,想自己写程序还是有一定的麻烦的。for循环语句在matlab里似乎是一个禁忌,所有老师都敦敦告诫,不要轻易使用for。而函数调用也是同样的低效, 有兴趣的同学可以参见。那么我们应该基于什么模块进行复用呢?
  答案是Cell模式。 Cell是matlab的一个特色功能,将一段代码以%%标记为cell以后,就可以重复执行了,相当于在命令行输入该代码块。以前,为了测试不同参数的结果,往往要用up arrow执行上一条指令。遇到需要多条指令的地方,就很容易出错。而算法又没有完善到可以封装成函数的地步,整天来回跑代码让人不堪其烦。通过cell模式,可以非常方便地在不同的代码块之间跳转,或重复执行一个代码块。
  对于我来说,matlab中的编程越来越趋向于bash编程,所用到的语言只是起到一个粘合剂的作用,负责把系统内置的高性能函数组合起来。这种对语句块的复用方式能够快速地调试出需要的功能,有点类似传统的goto,但是可以一直观察着执行的结果,事前无须编译 ,也不用考虑函数的接口问题。当算法稳定下来,就可以考虑用一个接口轻易地封装成函数了。同时也可以直接保存为mfile供以后使用。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:91064次
积分:1183
积分:1183
排名:千里之外
原创:23篇
转载:25篇
(1)(1)(1)(3)(1)(2)(2)(2)(4)(3)(4)(4)(21)第2讲 MATLAB数据_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
第2讲 MATLAB数据
上传于||暂无简介
大小:284.50KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢原文地址:
从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数组 ,{}是实际类型.结果显示是一致的
&& a={'啊',123,[3 5 6],[1 2;7 8],sym(1)}
[1x3 double]
[2x2 double]
&& class(a{1})
&& class(a(1))
C{5,3}{4,7}(:,4)
解读: cell数组的一个元素为cell类型,包含一个普通矩阵类型
x = C{5,3};
% x is a cell array
y = x{4,7};
% y is also a cell array
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可以是特殊函数或者句柄
days{1} = 'Sunday';
days{2} = 'Monday';
days{3} = 'Tuesday';
days{4} = 'Wednesday';
days{5} = 'Thursday';
days{6} = 'Friday';
days{7} = 'Saturday';
shortNames = cellfun(@(x)x(1:3), days, 'UniformOutput', false)
shortNames =
&&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 Arrayc = mat2cell(x, m, n) 转换为 m行n列cell数组&m = cell2mat(c) 必须是同一类型,而且限制不可包含cell数组或object类型,但是struct结构是可以的(同样这个struct不含&cell和object类型,否则依旧出错)Double and Cell ArrayC = 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帮助里面的循环例子:
mycell = { 'a' 1 2 3 ; 'b' 4 5 6 };
[nrows,ncols]= size(mycell);
filename = 'celldata.dat';
fid = fopen(filename, 'w');
for row=1:nrows
fprintf(fid, '%s %d %d %d\n', mycell{row,:});
fclose(fid);
仅有数值时候 可以考虑先cell2mat 然后csvwrite.cellfun的例子可以参考Matlab公司的
总结基本是就是总结了一下用法,特别是转换和保存方面的,相对于struct数组,由于Matlab中支持甚多,因此也就常用了.功能偏弱,但是基本按照规则,还是可以尽量减少出错的.希望大家也交换一下使用的心得~
阅读(...) 评论()MATLAB大神请进!!!一个m*2的cell数组中第二列元素均是cell数组,怎样将这些cell数组批量存为.mat文件_百度知道
MATLAB大神请进!!!一个m*2的cell数组中第二列元素均是cell数组,怎样将这些cell数组批量存为.mat文件
,名称2,数据也是cell数组:第一列
第二列‘名称1’
cell数组1‘名称2’
cell数组2……‘名称m’
cell数组m存成workspace中m个:原cell数组cellMatrix如下.mat请求matlab大神支援!,即原cell数组中第二列元素均为cell数组,第一列元素是数据项的名称,第二列元素是对应第一列数据名称的数据.mat文件,名称m,文件名分别为原cell数组第一列m个元素中的数据名称我现在有一个m*2的cell数组(m为2000左右).mat。示意图如下。我想编个程序将原cell数组第二列m个cell数组存成m个.mat文件:名称1.mat,……,第一列是相应cell数组名称
提问者采纳
temp&#39for i=1,不过以后载入第i个小数组之后:m
temp=cellMatrix{i,那个小数组的变量名都是temp,1};),2};end这样应该能存;
save(cellMatrix{i,&#39
这样的话,load第i+1个小数组后,原来的temp就被覆盖了,能不能改进下呢
你load完一个之后马上把temp复制到另一个变量里嘛。。。话说我很好奇为什么不直接把整个东西存到一个mat里面,那样方便得多啊。。。
提问者评价
谢谢你的解答^_^
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 matlab的cell2mat 的文章

 

随机推荐