matlab如何读入cell数组

cube = { [0,0,0,0; 0,0,1,1; 0,1,1,0], [1,1,1,1; 0,1,1,0; 0,0,1,1], ...
[0,1,1,0; 0,0,0,0; 0,0,1,1], [0,0,1,1; 1,1,1,1; 0,1,1,0], ...
[0,0,1,1; 0,1,1,0; 0,0,0,0], [0,1,1,0; 0,0,1,1; 1,1,1,1] }
% 3*5*8 box
box = { [0,0,0,0; 0,0,5,5; 0,3,3,0], [8,8,8,8; 0,5,5,0; 0,0,3,3], ...
[0,8,8,0; 0,0,0,0; 0,0,3,3], [0,0,8,8; 5,5,5,5; 0,3,3,0], ...
[0,0,8,8; 0,5,5,0; 0,0,0,0], [0,8,8,0; 0,0,5,5; 3,3,3,3]}
octahedron = { [1,0,0; 0,1,0; 0,0,1], [0,1,0; -1,0,0; 0,0,1], ...
[-1,0,0; 0,-1,0; 0,0,1], [0,-1,0; 1,0,0; 0,0,1], ...
[0,1,0; 1,0,0; 0,0,-1], [1,0,0; 0,-1,0; 0,0,-1], ...
[0,-1,0; -1,0,0; 0,0,-1], [-1,0,0; 0,1,0; 0,0,-1] }
% pyramid with square base (top half of octahedron)
pyramid = { [1,0,0; 0,1,0; 0,0,1], [0,1,0; -1,0,0; 0,0,1], ...
[-1,0,0; 0,-1,0; 0,0,1], [0,-1,0; 1,0,0; 0,0,1], ...
[1,0,-1,0; 0,-1,0,1; 0,0,0,0]}
% frustum (bottom half of pyramid expanded by 2)
frustum = { [2,0,0,1; 0,2,1,0; 0,0,1,1], [0,-2,-1,0; 2,0,0,1; 0,0,1,1], ...
[-2,0,0,-1; 0,-2,-1,0; 0,0,1,1], [0,2,1,0; -2,0,0,-1; 0,0,1,1] ...
[2,0,-2,0; 0,-2,-0,2; 0,0,0,0], [1,0,-1,0; 0,1,0,-1; 1,1,1,1]}
这样的.m文件怎么读入到function draw中并使用?
我在定义fuction之前load('polyhedra.m'),然后draw(cube),说cube没有定义

在读取文件的时候,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)}

a =
'啊'
[123]
[1x3 double]
[2x2 double]
[1x1 sym]

>> class(a{1})

ans =

char

>> class(a(1))

ans =

cell

>>

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 =
'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支持行列向量.

读写
首先要了解怎么情况会有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,:});

end

fclose(fid);
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-05-08
cube = { [0,0,0,0; 0,0,1,1; 0,1,1,0], [1,1,1,1; 0,1,1,0; 0,0,1,1], ...
[0,1,1,0; 0,0,0,0; 0,0,1,1], [0,0,1,1; 1,1,1,1; 0,1,1,0], ...
[0,0,1,1; 0,1,1,0; 0,0,0,0], [0,1,1,0; 0,0,1,1; 1,1,1,1] }
% 3*5*8 box
box = { [0,0,0,0; 0,0,5,5; 0,3,3,0], [8,8,8,8; 0,5,5,0; 0,0,3,3], ...
[0,8,8,0; 0,0,0,0; 0,0,3,3], [0,0,8,8; 5,5,5,5; 0,3,3,0], ...
[0,0,8,8; 0,5,5,0; 0,0,0,0], [0,8,8,0; 0,0,5,5; 3,3,3,3]}
octahedron = { [1,0,0; 0,1,0; 0,0,1], [0,1,0; -1,0,0; 0,0,1], ...
[-1,0,0; 0,-1,0; 0,0,1], [0,-1,0; 1,0,0; 0,0,1], ...
[0,1,0; 1,0,0; 0,0,-1], [1,0,0; 0,-1,0; 0,0,-1], ...
[0,-1,0; -1,0,0; 0,0,-1], [-1,0,0; 0,1,0; 0,0,-1] }
% pyramid with square base (top half of octahedron)
pyramid = { [1,0,0; 0,1,0; 0,0,1], [0,1,0; -1,0,0; 0,0,1], ...
[-1,0,0; 0,-1,0; 0,0,1], [0,-1,0; 1,0,0; 0,0,1], ...
[1,0,-1,0; 0,-1,0,1; 0,0,0,0]}
% frustum (bottom half of pyramid expanded by 2)
frustum = { [2,0,0,1; 0,2,1,0; 0,0,1,1], [0,-2,-1,0; 2,0,0,1; 0,0,1,1], ...
[-2,0,0,-1; 0,-2,-1,0; 0,0,1,1], [0,2,1,0; -2,0,0,-1; 0,0,1,1] ...
[2,0,-2,0; 0,-2,-0,2; 0,0,0,0], [1,0,-1,0; 0,1,0,-1; 1,1,1,1]}
这样的.m文件怎么读入到function draw中并使用?
我在定义fuction之前load('polyhedra.m'),然后draw(cube),说cube没有定义,那么在你需要使用数据的函数里面直接运行这个脚本就可以了:
polyhedra
第2个回答  2012-11-02
在你需要使用数据的函数里面直接运行这个脚本就可以了:
polyhedra追问

polyhedra;
function pprime=DrawRotatedPolyhedron(M,P)
poly=cell2mat(P);
n=size(P,2)
pprime=M*poly
end

这样octave里不行啊,
>> DrawRotatedPolyhedron(EulerRotation(pi/4,pi/4,0),cube)
error: `cube' undefined near line 5 column 50
error: evaluating argument list element number 2

追答

你是在调用函数的时候使用数据啊?那样的话,在命令窗口里输入(function的前面的那句不要):
polyhedra;
DrawRotatedPolyhedron(EulerRotation(pi/4,pi/4,0),cube)

追问

也就是不方便在写draw函数的时候调用这个polyhedra了?没有好办法?

追答

你要搞清楚到底是在函数里面还是在外面调用数据,如果在外面,就像上面所说;如果要在函数里面调,就不要把它作为函数的参数传递,可以把函数改写:
function pprime=DrawRotatedPolyhedron(M)
polyhedra;
P = cube;
poly=cell2mat(P);
n=size(P,2)
pprime=M*poly
end

然后调用函数的时候用:
DrawRotatedPolyhedron(EulerRotation(pi/4,pi/4,0))

本回答被提问者采纳