我是靠谱客的博主 重要天空,最近开发中收集的这篇文章主要介绍Matlab与Python的语法比较,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

          由于本人对Python和Matlab都不是十分熟,而由于工作两个工具都要用,经常困惑于两者的相似性。现总结如下:

          <一> Python的Dictionary和Matlab的struct的简单比较

                Matlab的struct叫做Dictionary也许更合适一些.

             Python中定义Dictionary           

>>> d = {"server":"mpilgrim", "database":"master"}

       Matlab中创建struct:

>> d = struct('server','mpilgrim', 'database','master')

       在Python中通过key来查找value:

>>> d["server"]
'mpilgrim'
>>> d["database"]
'master'

       在Matlab中通过字符串形式的fieldname来查找value(Using Dynamic Field Names):

>> d.('server')

ans =

mpilgrim

>> d.('database')

ans =

master              

                在Python中不能通过value来获取key:

                >>> d["mpilgrim"]
                     Traceback (innermost last):
                     File "<interactive input>", line 1, in ?
                     KeyError: mpilgrim

              在Matlab中也不行(不能通过value来查找fieldname):

                 >> d.('mpilgrim')
                      ??? Reference to non-existent field 'mpilgrim'.

                

               在Python中修改已经存在的key的value:

               >>> d["database"] = "pubs"
              >>> d
                 {'server': 'mpilgrim', 'database': 'pubs'}

             在Matlab中修改已经存在的field的value:

                >> d.('database')='pubs'

                d =

                   server: 'mpilgrim'
                  database: 'pubs'

                在Python中添加新的key-value对:

              >>> d["uid"] = "sa"
              >>> d
                      {'server': 'mpilgrim', 'uid': 'sa', 'database': 'pubs'}

              在Matlab中添加新的field:

               >> d.('uid')='sa'

               d =

                      server: 'mpilgrim'
                      database: 'pubs'

              

              在Python中删除Dictionary的元素:

             >>> d
                       {'database': 'master', 'uid': 'sa', 'server': 'mpilgrim'}
              >>> del d['uid']
             >>> d
                     {'database': 'master', 'server': 'mpilgrim'}

              在Matlab中删除stuct的field:

             >> d=struct('database', 'master', 'uid', 'sa', 'server', 'mpilgrim')

             d =

                 database: 'master'
                 uid: 'sa'
                server: 'mpilgrim'

             >> d=rmfield(d,'uid')

                  d =

                    database: 'master'
                   server: 'mpilgrim'

           在Python中删除Dictionary所有元素:

                >>> d.clear()
                >>> d
                         {}

              在Matlab中删除struct所有field:

               >> d=struct()

                    d =

                       1x1 struct array with no fields.

          但是两者(Python的Dictionary和Matlab中的struct)还是有许多差异的,例如:

          在Python中,key可以使用多种类型:

          >>> d[42] = "douglas"
          >>> d
                  {'server': 'mpilgrim', 'uid': 'sa', 'database': 'master',42: 'douglas', 'retrycount': 3}

         在Matlab中,甚至不能用数字作为field name:

         >> d.123='123'
             ??? d.123='123'
                 |
              Error: Missing MATLAB operator.

         >> d.(123)='123'
               ??? Argument to dynamic structure reference must evaluate to a valid field name.

         以上是对Python的Dictionary和Matlab的struct的简单比较。

      <二>Python的List和Matlab的Cell Array比较              

两者的重要不同:Python的List的下标从0开始,Matlab的Cell Array的下标从1开始

       Python中List的定义:

>>> li = ["a", "b", "mpilgrim", "z", "example"]
>>> li
['a', 'b', 'mpilgrim', 'z', 'example']
>>> li[0]           
'a'
>>> li[4]       
'example'

      Matlab中Cell Array的定义:

>> li = {'a', 'b', 'mpilgrim', 'z', 'example'}

li =

     'a'    'b'    'mpilgrim'    'z'    'example'

>> li(1)

ans =

     'a'

>> li(5)

ans =

     'example'

      两者的定义和使用是类似的,只是注意下标,一个从0开始,一个从1开始。

      Python中可使用负的List索引,但Matlab中不能用负数来索引Cell Array,两者在此是不同的,就不再举例了。

      <三>slice(分片)

      Python中List的slice:

>>> li[0:3]
['a', 'b', 'mpilgrim']

       0:3表示得到下标为0、1、2的List元素。

       在Matlab中想要对Cell Array 实现类似的效果要这样做:

>> li(1:3)

ans =

     'a'    'b'    'mpilgrim'

       这里1:3是一个向量(1,2,3),用这个向量作为下标对li进行索引。

       由此可见在Slice这个功能上Python和Matlab很相似但也有很大不同。

        Slice的简写:

       在Python中:

    >>> li[:3]
['a', 'b', 'mpilgrim']
>>> li[3:]
['z', 'example']

      但是在Matlab中不能这样做,只能写成:

>> li(1:3)

ans =

     'a'    'b'    'mpilgrim'

>> li(4:end)

ans =

     'z'    'example'

      <4>在末尾追加元素

      在Python中对List,可以使用append和extend来实现,但两者功能有所不同,append用来追加单个元素,extend用来进行List的连接

      在Python中对List使用extend:

>>> li = ['a', 'b', 'c']
>>> li.extend(['d', 'e', 'f'])
>>> li
['a', 'b', 'c', 'd', 'e', 'f']
>>> len(li)           
6

      在Matlab中对Cell Array实现类似的效果:

>> li={'a','b','c'}

li =

     'a'    'b'    'c'

>> li=[li {'d','e','f'}]

li =

     'a'    'b'    'c'    'd'    'e'    'f'

>> numel(li)

ans =

      6

      在Python中对List使用append:

>>> li = ['a', 'b', 'c']
>>> li.append(['d', 'e', 'f'])
>>> li
['a', 'b', 'c', ['d', 'e', 'f']]
>>> len(li)      
4
>>> li[-1]
['d', 'e', 'f']

      在Matlab中对Cell Array实现类似效果:

>> li={'a','b','c'}

li =

     'a'    'b'    'c'

>> li{end+1}={'d','e','f'}

li =

     'a'    'b'    'c'    {1x3 cell}

>> numel(li)

ans =

      4

>> li{end}

ans =

     'd'    'e'    'f'

      至于Python中对List的搜索功能,我没有在Matlab中找到对应的函数,也许需要自己去实现吧。

      <五>下面再看一下格式化字符串。

      Python和Matlab都使用C语言的风格来实现格式化字符串:

      Python中:

>>> k = "uid"
>>> v = "sa"
>>> "%s=%s" % (k, v)
'uid=sa'

       Matlab中:

>> k='uid';
>> v='sa';
>> sprintf('%s=%s',k,v)

ans =

uid=sa

      再看看Python中List的解析:

>>> li = [1, 9, 8, 4]
>>> [elem*2 for elem in li]
[2, 18, 16, 8]

       在Matlab中这种操作对于Numeric Matrix实在是太容易了,但对于Cell Array怎样操作,我不太清楚,只有先转换成Numeric Array才好:

>> li={1,9,8,4};
>> numli=zeros(1,numel(li));
>> for n=1:numel(numli)
numli(n)=li{n};
end
>> numli*2

ans =

      2    18    16     8

      再看一个比较综合的例子:将一个Dictionary中的所有key-value对进行格式化字符串处理,结果保存在一个List中:

      在Python中:

>>> params = {"server":"mpilgrim", "database":"master", "uid":"sa"}
>>> li=["%s=%s" % (k, v) for k, v in params.items()]
>>> li
['database=master', 'uid=sa', 'server=mpilgrim']

       使用item方法,来得到Dictionary中所有的key-value对。

      我对Matlab的运用还不够熟练,没有找到简洁的实现类似功能的方法,只好使用一个循环:

>> li=[]

li =

      []

>> params = struct('server','mpilgrim', 'database','master', 'uid','sa')

params =

       server: 'mpilgrim'
     database: 'master'
         uid: 'sa'

>> names=fieldnames(params);
>> for n=1:numel(names)
li{n}=sprintf('%s=%s',names{n},params.(names{n}));
end
>> li

li =

    'server=mpilgrim'    'database=master'    'uid=sa'

      将params数据保存在struct里,实现类似Python中Dictionary的功能,用fieldnames函数得到一个保存着params结构体所有field name的Cell Array,利用sprintf来实现格式化字符串操作。在sprintf中使用字符串形式的field name来引用域(Using Dynamic Field Names)。最后的结果li是 一个Cell Array。

      下面再讨论一下lambda:

      Python中使用lambda函数:

>>> g = lambda x: x*2
>>> g(3)
6

      在Matlab中实现:

>> g=@(x)x*2;
>> g(3)

ans =

     6

      在Python中还可这样用:

>>> (lambda x: x*2)(3)
6

      但是Matlab中好像不行:

>> @(x)x*2(3)
??? @(x)x*2(3)
           |
Error: Unbalanced or misused parentheses or brackets.


最后

以上就是重要天空为你收集整理的Matlab与Python的语法比较的全部内容,希望文章能够帮你解决Matlab与Python的语法比较所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部