Matlab “ +/@ 文件夹” 的使用与python匿名函数

1.类文件夹的名称始终以 @ 字符开头,后跟类名称。将类定义文件放在类文件夹中,该文件夹也可以包含单独的方法文件。类定义文件必须与类文件夹同名(除 @ 字符外)。

  •  
    .../+parent_folder/@MyClass/MyClass.m
    .../+parent_folder/@MyClass/myMethod1.m
    .../+parent_folder/@MyClass/myMethod2.m

 其中myMethod是方法,可以理解为自定义的一些函数

2.如果你按照普通的命名方式,比如:parent_folder/MyClass.m ,或者parent_folder/@MyClass/MyClass.m ,这样matlab只能知道这是一个m文件。所以必须要“+”号:+parent_folder/@MyClass/MyClass.m

3. 以具体工程文件为例来看看

图1

可见model.m文件图标和底下所有m文件图标不一样,类文件和函数文件的区别

另外,private文件夹的意思参照包含类定义的文件夹 - MATLAB & Simulink - MathWorks 中国

4.使用时,如下导入model文件夹,这里的model应该指的@model的model,这样我们就可以在代码里使用model.m类里的定义的参数与性质,同时也可以使用@model文件夹下的其它的method函数。(“P.参数名”有点像结构体)

 5. @还有其它用处

一、函数句柄

>> f = @cos %内置函数的句柄

>> f(pi/3)
ans =
    0.5000


>> f = @(x)(x.^2+4*x+4) %自己构造的函数句柄,当然也可以是自己定义的函数
f =
  包含以下值的 function_handle:
    @(x)(x.^2+4*x+4)
>> f([3,4])
ans =
    25    36

这个和python中的 匿名函数——lambda函数很类似!!!

lambda x, y: x*y			# 函数输入是x和y,输出是它们的积x*y
lambda:None					# 函数没有输入参数,输出是None
lambda *args: sum(args)		# 输入是任意个数参数,输出是它们的和(隐性要求输入参数必须能进行算术运算)
lambda **kwargs: 1			# 输入是任意键值对参数,输出是1
#1.将lambda函数赋值给一个变量,通过这个变量间接调用该lambda函数:

add = lambda x, y: x+y

##相当于定义了加法函数lambda x, y: x+y,并将其赋值给变量add,这样变量add就指向了具有加法功能的函数。
这时我们如果执行add(1, 2),其输出结果就为 3
----------------------------------------------------------------------------------------

#2.将lambda函数赋值给其他函数,从而将其他函数用该lambda函数替换

time.sleep=lambda x: None

# 这样,在后续代码中调用time库的sleep函数将不会执行原有的功能。
# 例如:
time.sleep(3)	# 程序不会休眠 3 秒钟,而是因为lambda输出为None,所以这里结果是什么都不做
----------------------------------------------------------------------------------------

#3.将lambda函数作为参数传递给其他函数
这里举例map函数,map函数接收两个参数,一个是函数,一个是序列

# ===========一般写法:===========
# 计算平方数
def square(x):
	return x ** 2

map(square, [1,2,3,4,5])	# 计算列表各个元素的平方
# 结果:
[1, 4, 9, 16, 25]


# ===========匿名函数写法:============
# 计算平方数,lambda 写法
map(lambda x: x ** 2, [1, 2, 3, 4, 5])
# 结果:
[1, 4, 9, 16, 25]	 


# 提供两个列表,将其相同索引位置的列表元素进行相加
map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
# 结果:
[3, 7, 11, 15, 19]

当然@还可以在matlab的类中使用!!

首先定义一个父类

classdef Point2D < handle

% 定义父类

   properties

      x;

      y;

   end

   methods

       function Obj = Point2D(x0,y0)

            Obj.x = x0;

            Obj.y = y0;

       end

       function print(Obj)

           disp(['x=',num2str(Obj.x)]);

           disp(['y=',num2str(Obj.y)]);

       end

       function Sum = add(Obj)

            Sum = Obj.x+Obj.y;

        end

   end

end

然后子类继承后可通过@调用父类中的同名方法

classdef Point3D < Point2D %matlab中通过<来继承类

% 定义子类

    properties

       z;

    end

    methods

        function Obj = Point3D(x0,y0,z0)

            Obj = Obj@Point2D(x0,y0);

            Obj.z = z0;

        end

        function print(Obj)

           print@Point2D(Obj)

           disp(['z=',num2str(Obj.z)]);

        end

        function Sum = add(Obj)

            temp = add@Point2D(Obj);

            Sum = temp+Obj.z;

        end

    end

end
 

可参考

(45条消息) Matlab 中@ 的用法_matlab @_心网千结的博客-CSDN博客

(45条消息) matlab中的@+函数名调用函数_matlab @函数_zfliu96的博客-CSDN博客

(56条消息) matlab初学笔记(一) 在一个.m文件中定义多个独立函数_matlab多个函数在一个文件中_AltarIbnL的博客-CSDN博客

Python 之 lambda 函数完整详解 & 巧妙运用_lambda函数python_Nick Peng的博客-CSDN博客

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值