MATLAB Cell函数使用技巧

这篇具有很好参考价值的文章主要介绍了MATLAB Cell函数使用技巧。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

MATLAB Cell函数使用技巧

谈谈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 =

abc

ans =

     9     5     6

>> b=a{1,1}

b =

cellclass

元胞数组:

元胞数组是MATLAB的一种特殊数据类型,可以将元胞数组看做一种无所不包的通用矩阵,或者叫做广义矩阵。组成元胞数组的元素可以是任何一种数据类型的常数或者常量,每一个元素也可以具有不同的尺寸和内存占用空间,每一个元素的内容也可以完全不同,所以元胞数组的元素叫做元胞(cell)。和一般的数值矩阵一样,元胞数组的内存空间也是动态分配的。

(1)元胞数组的创建

>> a={'matlab',20;ones(2,3),1:10}

a =

    'matlab'        [         20]

    [2x3 double]    [1x10 double]

>> b=[{'matlab'},{20};{ones(2,3)},{1:10}]

b =

    'matlab'        [         20]

    [2x3 double]    [1x10 double]

>> c={10}

c =

    [10]

>>c(1,2)={2}

c =

    [10]    [2]

>>c(2,2)={5}

c =

    [10]    [2]

      []    [5]

>>isequal(a,b)

ans =

     1

>>whos

Name      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)

a =

    {[]}

>> b=cell(1,2)

b =

     []     []

>> c=cell(3,3)

c =

     []     []     []

     []     []     []

     []     []     []

>> d=cell(2,2,2)

d(:,:,1) =

     []     []

     []     []

d(:,:,2) =

     []     []

     []     []

>>whos

Name      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}

a =

    [        20]    'matlab'   

    [2x3 double]    [1x3 double]

>>str=a(1,2)

str =

    'matlab'

>>class(str)

ans =

cell

>>str=a{1,2}

str =

matlab

>>class(str)

ans =

char

()和{}有着本质的区别,大括号用于表示元胞的内容,小括号表示指定的元胞。

a =

    [        20]    'matlab'   

    [2x3 double]    [1x3 double]

>>a{2,1}(2,2)

ans =

    0.9134

>>a{2,1}(2,3)

ans =

    0.0975

>>a{1,2}(2)

ans =

a

使用元胞的下标,可将一个元胞数组的子集赋值给另一个变量,创建新的元胞数组。

>> a=[{1},{2},{3};{4},{5},{6};{7},{8},{9}]

a =

    [1]    [2]    [3]

    [4]    [5]    [6]

    [7]    [8]    [9]

>> b=a(2:3,2:3)

b =

    [5]    [6]

    [8]    [9]

>> c=a(1:3,2:3)

c =

    [2]    [3]

    [5]    [6]

    [8]    [9]

本例使用元胞下标的方式创建了新的元胞数组b和c,通过结果看出b和c就是元胞数组a的一部分。

(3)元胞数组的删除和重塑

要删除单元数组中的行或列,可以用冒号表示单元数组中的行或列,然后对其赋一个空矩阵即可。

a={20,'matlab';ones(2,3),1:3}

a =

    [        20]    'matlab'   

    [2x3 double]    [1x3 double]

>>a(1,:)=[]

a =

    [2x3 double]    [1x3 double]

>> a={20,'matlab';ones(2,3),1:3};

>>a{1}=[]

a =

              []    'matlab'   

    [2x3 double]    [1x3 double]

>>a(1)=[]

a =

    [2x3 double]    'matlab'    [1x3 double]

>>a(2)=[]

a =

    [2x3 double]    [1x3 double]

>>a(1,2)=[]

??? A null assignment can have only one non-colon index.

>>a(1)=[]

a =

    [1x3 double]

元宝数组和其他数组一样,也可以通过reshape函数改变形状,改变后的元胞数组与原元胞数组的元素个数相同,不能通过改变形状来添加或删除元胞数组中的元素。

>> a=cell(4,4)

a =

     []     []     []     []

     []     []     []     []

     []     []     []     []

     []     []     []     []

>>size(a)

ans =

     4     4

>> b=reshape(a,2,8)

b =

     []     []     []     []     []     []     []     []

     []     []     []     []     []     []     []     []

>>size(b)

ans =

     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}

a =

    [        20]    'matlab'        [3.0000 - 7.0000i]

    [2x3 double]    [1x3 double]    [               0]

>> b=cellfun('isreal',a)

b =

     1     1     0

     1     1     1

>> c=cellfun('length',a)

c =

     1     6     1

     3     3     1

>> d=cellfun('isclass',a,'double')

d =

     1     0     1

     1     1     1

(函数的应用)

cellfun函数的主要功能是对元胞数组的元素(元胞)分别指定不同的函数,不过,能够在cellfun函数中使用的函数ushuliang是有限的。

能在cellfun中使用的函数:

isempty:若元胞元素为空,则返回逻辑真

islogical:若元胞元素为逻辑类型,则返回逻辑真

isreal:若元胞元素为实数,则返回逻辑真

    length:元胞元素的长度

ndims:元胞元素的维数

prodofsize:元胞元素包含的元素个数

(7)元胞数组的嵌套

元胞数组的元胞中包含其他的元胞数,称为嵌套元胞数组,没有嵌套结构的元胞则称为页元胞。使用嵌套的大括号或cell函数,或直接用赋值表达式,都可以创建嵌套单元数组,另外还可以访问嵌套元胞数组的子数组、元胞或元胞的元素。

>> a=cell(1,2)

a =

     []     []

>>a(1,2)={cell(2,2)}

a =

     []    {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)元胞数组与数值数组间的转化

应用循环,可以将元胞数组转化为数值数组。

2010-11-08  12:06:44

zz: http://www.cnblogs.com/Lifehacker/archive/2010/05/15/matlab_cell_mode.html

Matlab Cell功能

  最近完成模式分类的作业,需要大量使用matlab,期间发现了一个问题,是matlab代码的复用程度。

  在面向过程编程里,基本的复用单位是函数,程序的复杂度籍此下放到函数的接口上。设计好函数间的接口,基本上就成功了一半。在面向对象编程里,基本的复用单位是对象,对象使得数据具有了一定程度的自维护。而在matlab里,我很长时间都没有找到方向,因为我搞不清楚复用的单位是什么。

  matlab中,基本的单位是矩阵,针对矩阵系统有一大堆的函数供你调用。但是,想自己写程序还是有一定的麻烦的。for循环语句在matlab里似乎是一个禁忌,所有老师都敦敦告诫,不要轻易使用for。而函数调用也是同样的低效,有兴趣的同学可以参见此文。那么我们应该基于什么模块进行复用呢?

  答案是Cell模式。 Cell是matlab的一个特色功能,将一段代码以%%标记为cell以后,就可以重复执行了,相当于在命令行输入该代码块。以前,为了测试不同参数的结果,往往要用up arrow执行上一条指令。遇到需要多条指令的地方,就很容易出错。而算法又没有完善到可以封装成函数的地步,整天来回跑代码让人不堪其烦。通过cell模式,可以非常方便地在不同的代码块之间跳转,或重复执行一个代码块。

  对于我来说,matlab中的编程越来越趋向于bash编程,所用到的语言只是起到一个粘合剂的作用,负责把系统内置的高性能函数组合起来。这种对语句块的复用方式能够快速地调试出需要的功能,有点类似传统的goto,但是可以一直观察着执行的结果,事前无须编译,也不用考虑函数的接口问题。当算法稳定下来,就可以考虑用一个接口轻易地封装成函数了。同时也可以直接保存为mfile供以后使用。文章来源地址https://www.toymoban.com/news/detail-717084.html

到了这里,关于MATLAB Cell函数使用技巧的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用matlab中cell2mat报错:错误使用cat 要串联的数组的维度不一致

    从Excel中用readtable读取数据,因为默认每一列都是cell类型,想转成matrix类型方便使用。 在matlab官方文档搜到cell2mat函数可用于转换 但转换时报错: 错误使用 cat 要串联的数组的维度不一致 搜索后发现错误原因在于每行cell中长度不一致。 cell中的存储格式是char,用单引号表示

    2024年02月13日
    浏览(57)
  • 基于cell数组的MATLAB仿真(附上完整仿真源码)

    MATLAB是一款强大的数学软件,它提供了许多数据结构来存储和处理数据。其中,cell数组是一种非常有用的数据结构,它允许在一个数组中存储不同类型的数据,包括数值、字符串、逻辑值和其他cell数组等。 在MATLAB中,cell数组的定义格式为{ },例如: 上述代码定义了一个包

    2023年04月09日
    浏览(73)
  • 【小技巧】MATLAB中的使用Git的工作流程

    目录 1.Git简介     2.Git操作步骤         MATLAB中的Git是一种版本控制工具,它使你能够跟踪和管理项目代码的变化。Git的核心思想是在开发过程中记录代码的不同版本,以便可以随时回溯到以前的版本或合并多个开发人员的更改。下面是MATLAB中的Git的一些关键概念和操作:

    2024年02月06日
    浏览(45)
  • 使用cell2mat函数时提示串联矩阵维度不一致解决方法

    我们想把元胞数组转换为普通数组时经常遇到这个问题,为了解决这个问题,我们可以采用填充的方式首先将元胞数组填充完整,再进行转换。 以上为一个示例,我首先求出矩阵每行的不重复的元素,得到一个元胞数组,元胞数组每行长度不一致,使用cellfun函数将元胞数组

    2024年02月11日
    浏览(48)
  • MySQL特殊函数使用技巧

    使用group_concat函数,可以轻松的把分组后,name 相同的数据拼接到一起,组成一个字符串,用逗号分隔。 通过该函数就能获取字符长度。 在某个字符串中的位置 将字符串中的字符 A 替换成 B。REPLACE(name,‘A’,‘B’) 获取当前时间 这样就能将 order 表中的部分数据,非常轻松插

    2024年02月04日
    浏览(38)
  • 弹出 think-cell 许可证密钥窗口丨使用教程

    think-cell需要使用有效的许可证密钥才能运行。每次启动 Microsoft PowerPoint 或 Microsoft Excel 时,都会检查许可证密钥。若您的系统上找不到任何有效的许可证信息,或许可证密钥即将到期,则会显示 think-cell 许可证密钥对话窗口。     think-cell 许可证密钥对话框解释了其出现的

    2024年02月04日
    浏览(37)
  • SQL使用技巧(6)HIVE开窗函数

    开窗函数的使用铁律:不要滥用 先想明白自己要实现什么样的功能,然后再去实践。没有目的的尝试段不可取,会难以理解各开窗函数的真正用法。 如果没有现成可用HIVE库,可以参见本人 大数据单机学习环境搭建 系列文章。 1.1Hive建表 1.2数据准备 1.3保存为HDFS文件 1.4验证

    2024年02月08日
    浏览(60)
  • SQL使用技巧(4.1)Hive日期时间函数

    常用的格式化(format)标识符: 本章节每一行代码后都有运算说明和执行结果样例,例如 - - 返回当前系统日期 yyyy-MM-dd, 【2023-04-01】 原生hive中不支持 now() 的写法,经过加工的工具(TDWTDH)可能支持,不绝对。 unix_timestamp() 也会返回一个时间戳,但并不是系统当前时间的时间

    2024年02月12日
    浏览(44)
  • 爬虫便捷操作之selenium使用技巧

    在爬虫中占据比较重要的地位 是一种浏览器自动化的工具,所谓的自动化是指,我们可以通过代码的形式制定一系列的行为动作,然后执行代码,这些动作就会同步触发在浏览器中。 我们在抓取一些普通网页的时候requests基本上是可以满足的. 但是, 如果遇到一些特殊的网站

    2024年02月03日
    浏览(47)
  • 使用指针或引用作为函数参数的编程技巧

    空指针检查: 使用指针允许在函数内部检查传递的指针是否为 nullptr 。这使得在函数内部能够处理空指针的情况,增加代码的健壮性。如果使用引用,无法表示空值,而使用指针则可以通过传递 nullptr 来表示缺失的数据。

    2024年02月16日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包