【Matlab8】cell、struct、字符串



2014年09月16日    Author:Guofei

文章归类: Matlab    文章编号: 11005

版权声明:本文作者是郭飞。转载随意,标明原文链接即可。本人邮箱
原文链接:https://www.guofei.site/2014/09/16/matlab8.html


5. 数据结构

显示数据类型

class(x)

基本类型

  • double
  • single
  • 整型:uint8, uint16, uint32, uint64, int8, int16, int32, int64

5.1 cell

cellfun(@myfun1,my_cell)
%逐行计算,放回mat

mat2cell(my_mat,[1,1,1,1],[1,1,1,1])
%后两个矩阵是cell每格的矩阵大小

5.2 struct

fieldnames(s)%返回字段名
getfield(s,fieldname)%相当于s.fieldname
setfield(s,fieldname,v)%相当于s.fieldname=v
rmfield(s,fieldname)%删除字段
isfield(s,fieldname)%判断是否是字段
isstruct(s)%判断是否是struct
orderfields%给字段排序

stuctfun

5.3 table

方式1:读取文件生成table

T = readtable(FILENAME,'FileType',FILETYPE)
% .txt, .dat, .csv, .xls, .xlsx, .xlsb, .xlsm, .xltm, .xltx, .ods:
'ReadVariableNames'     0/1  第一行是否是变量名
'ReadRowNames'    0/1 第一列是否是行名
'TreatAsEmpty'   string 或 cell of string 如果某cell为空,用什么代替
'Sheet'      
'Range'   
'basic'

方式2:直接构造

T = table(var1,...,varN,Name,Value) % name='RowNames'或'VariableNames'
% 变量可以是多种对象,例如:
T = table(categorical({'M';'F';'M'}),[45;32;34],... {'NY';'CA';'MA'},logical([1;0;0]),...'VariableNames',{'Gender''Age''State''Vote'})

方式3:array2table

T = array2table(my_array,Name,Value)
% my_array可以是matrix或cell
% name = 'RowNames'或'VariableNames'

取table中的数据

% 1. 返回matrix或cell
T.v1

% 2. 返回matrix或cell
T.v2(3)
T.v2([4,3])

% 3. 返回table:
T(1,1)
T(:,2)
T([3,2],:)

% 4. 用变量名返回table
T('c','v3')
T('c',:)
T(:,'v3')
T(:,{'v1','v3'})

修改

% 删除
T('c',:)=[]

% 添加列:赋值法
T.new_variables=[4;5;6;7];%添加mat
T.new_variables={6;4;7;8};%添加cell

% 添加列:合并法
T_new=[T_add,T]

% 添加行:合并法
T_new=[T_add;T]

保存

writeable(nasdaq,'mydata.csv')  
writetable(T,'mydata.txt','Delimiter',' ')

互相转化

table2array
struct2table

varfun:基于 table 的函数

B = varfun(@myfun,A, 'PARAM1',val1, 'PARAM2',val2, ...)

  • @myfun:输入是A.var1,输出是一个matrix或cell,进而合并到B中
  • ‘InputVariables’:所需要计算的列。值:
    1. 列名(字符串) 例如:{‘variable2’,’variable3’}
    2. 列号(数字) 例如:[3,2]
    3. 逻辑矩阵 例如:logical([0,1,0,1,0,0])
  • ‘GroupingVariables’。分组计算,当分组时,@myfun的输入变为每组的列
  • ‘OutputFormat’。输出格式:’uniform’, ‘table’, ‘cell’
  • ‘ErrorHandler’ 。错误时,运行@myfun2

rowfun:行函数,比varfun应用场景更广泛

B = rowfun(@myfun,A, 'PARAM1',val1, 'PARAM2',val2, ...)
  • @myfun: function [y1,y2,y3]=myfun(x1,x2,x3,x4),每次读入一行
  • ‘GroupingVariables’。如果有这个值,@myfun的输入是mi*ni的变量,而不是单纯的一行了
  • ‘OutputVariableNames’,输出格式:’uniform’, ‘table’, ‘cell’

基于 table 的排序函数

 B = sortrows(A,VARS,MODE)
  • 当vars=’RowNames’,意思是按行名排序
  • MODE is ‘ascend’ (the default) or ‘descend’

连接

[C,IB] = join(A, B, 'PARAM1',val1, 'PARAM2',val2, ...)

'Keys':共同的列名
'LeftKeys'  'RightKeys'  左表和右表
'LeftVariables'  C表中包括A表中的那些字段
'RightVariables'
'KeepOneCopy'

innerjoin

[C,IA,IB] = innerjoin(A, B, 'PARAM1',val1, 'PARAM2',val2, ...)
'Keys', 'LeftKeys', 'RightKeys'
'LeftVariables'   'RightVariables'


[C,IA,IB] = outerjoin(A, B, 'PARAM1',val1, 'PARAM2',val2, ...)
'Keys', 'LeftKeys', 'RightKeys'
'MergeKeys'
'LeftVariables', 'RightVariables'
'Type' = 'full', 'left', or 'right'

其它

size

intersect 交集。返回两表中的相同的行,返回table  
setxor 差集
ismember 查询表A中的行是否在表B中也出现,回逻辑向量  
setdiff 查询两表之间的差异,返回table  
unique 返回的表中没有相同的行  
sextor 两个集合交集的非  
union 两个集合的并  
join 自然连接  
innterjoin 内连接  
outerjoin 外连接  

Data organization的操作  
summary 返回table的基本信息  
stack 把table的各列摞成一列  
unstack 把table的某一列展开成为若干列  
ismissing 找到table中那些没有赋值的项,返回logical index  
standizeMissing 给未赋值项赋默认值  

stack&unstack

Storm = [3;3;1;3;1;1;4;2;4;2;4;2];
Town = {'T1';'T3';'T1';'T2';'T2';'T3';...
    'T2';'T1';'T3';'T3';'T1';'T2'};
Snowfall = [0;3;5;5;9;10;12;13;15;16;17;21];
T = table(Storm,Town,Snowfall)
W = unstack(T,'Snowfall','Town')


[W,it] = unstack(T,'Price','Stock','AggregationFunction',@mean)

5.4 字符串

字符串格式清洗

char(hex2dex())     %unicode转汉字
[data1,data2,data3,data4]=textread('myfile.txt','%n%n%n%n','delimiter', ',')
 findstr(str1,str2)%查找

%unicode转汉字2
ind=findstr(k,'\u');
dd=[k(i+2),k(i+3),k(i+4),k(i+5)];
    out_put(c)=char(hex2dec(dd));
    c=c+1;

ascii码

char()   数字转字符  元胞转字符
abs()      字符转ascii码

时间:

现在时间:
date      %字符串
now      %连续数字时间
clock      %向量时间

datestr()   %转字符串     datenum()    %转数字    datevec()     %转向量
datenum(‘20150101’,’yyyymmdd ’)
yyyymmdd HH:MM:SS

进制:

bin二进制 hex十六进制   dec十进制
base2dec(数据,进制)
dec2base(你的数,进制,位数)

元胞函数

cellfun(@(x){你的函数 },元胞)

矩阵转元胞

n = 10;
a = rand(n);
acell = mat2cell(a,ones(n,1),ones(n,1));

元胞合并

[a,b]
rats(1.5)小数转换成分数,并变成字符格式
num2str(11,'%02d')转换字符串自动加0

字符串

C = textscan(str,formatSpec,N)


K = strfind(TEXT,PATTERN)
s = 'How much wood would a woodchuck chuck?';
      strfind(s,'a')    returns  21
      strfind('a',s)    returns  []
      strfind(s,'wood') returns  [10 23]
      strfind(s,'Wood') returns  []
      strfind(s,' ')    returns  [4 9 14 20 22 32]


TF = strcmp(S,C) % 比较两个字符串是否完全相等,是,返回真,否则,返回假
% strncmp    比较两个字符串前n个字符是否相等,是,返回真,否则,返回假
% strcmpi    比较两个字符串是否完全相等,忽略字母大小写
% strncmpi   比较两个字符串前n个字符是否相等,忽略字母大小写
% isletter  检测字符串中每个字符时否属于英文字母
% isspace    检测字符串中每个字符是否属于格式字符(空格,回车,制表,换行符等)
% isstrprop  检测字符每一个字符是否属于指定的范围
a='  a';b='b  b';c='cccc';m=''
% 获取字符串长度
length(a)     
% 连接两个字符串,每个字符串最右边的空格被裁切
d=strcat(a,c)  
length(d)

% 连接多行字符串,每行长度可不等,自动把非最长字符串最右边补空格
% 使与最长字符串相等,会忽略空字符串
e=strvcat(a,b,m)
size(e)

% char连接,空字符串会被空格填满
f=char(a,b,m)
size(f)

% 字符串替换和查找   
% strrep(str1,str2,str3)
% 把str1中所有的str2字串用str3来替换,区分大小写

% strfind(str,patten) 查找str中是否有pattern,返回出现位置,没有出现返回空数组
% findstr(str1,str2)   查找str1和str2中,较短字符串在较长字符串中出现的位置,没有出现返回空数组
% strmatch(patten,str) 检查patten是否和str最左侧部分一致
% strtok(str,char)     返回str中由char指定的字符串前的部分和之后的部分,
mm='youqwelcome';
[mm1,mm2]=strtok(mm,'q')
% blanks(n)            创建有n个空格组成的字符串
% deblank(str)          裁切字符串的尾部空格
% strtrim(str)          裁切字符串的开头和尾部的空格,制表,回车符
% lower(str)           将字符串中的字母转换成小写
% upper(str)            将字符串中的字母转换成大写  
% sort(str)              按照字符的ASCII值对字符串排序
% num2str         将数字转换为数字字符串
% str2num          将数字字符串转换为数字
% mat2str          将数组转换成字符串
% int2str          把数值数组转换为整数数字组成的字符数组

CELL数组中的字符串比较:
c=cell(2,1);
c(1,1)=cellstr('xxx');
c(2,1)=cellstr('yyyyyyy');
strcmp(c{1,1},c{2,1});

isequal   Test arrays for equality, 可用来比较两个字符数组是否相同。

5.5 正则表达式

regexp——用于对字符串进行查找; regexpi——用于对字符串进行查找,但不区分大小写; regexprep——用于对字符串进行查找并替换。

[o11,o22,o33]=regexpi(str,expression,’start’,’end’,’match’)

str可以是cell,这时natgout也是元胞

[match,noMatch] = regexp(str,expression,'match','split')
combinedStr = strjoin(noMatch,match)%'split'的逆运算

书推荐

  1. 【强烈推荐】matlab与数学试验 国防工业出版社 全面介绍了matlab的各种应用,值得注意的是:数值积分试验,微分方程试验,随机模拟实验,加密方法试验,分形模拟试验,遗传算法试验
  2. 傅里叶变换及其应用 布雷斯威尔 西安交通大学出版社 好书!包含拉普拉斯变换,扩散方程,成像技术等,值得看!!
  3. 数理统计及其在数学建模中的实践(done)
  4. matlab入门到精通:符号计算,电路模拟,simulink
  5. 精通matlab,计算篇(插值,傅立叶分析,偏微分方程),计算实例
  6. 数理统计与数据分析
  7. matlab实用指南(上下)电子工业出版社 书比较薄,比较深

您的支持将鼓励我继续创作!