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. 以具体工程文件为例来看看
可见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博客