如何破译matlab函数语法歧义

时间:2013-08-07 20:58:20

标签: matlab

我无法在任何地方找到这种语法

y = @(beta, x)x*beta;

其中x是一些向量或矩阵。 @是否用于引用另一个函数,因此您可以在同一个.m文件中拥有多个外部可访问函数?对不起,我是matlab的新手,但在文档

中找不到

2 个答案:

答案 0 :(得分:4)

这是在Matlab中定义匿名函数的方法。它与

基本相同
function result = y(beta, x)

result = x * beta;

但不需要m文件或子函数来定义它。它们可以在其他m文件中构建,甚至可以在表达式中构建。典型的用法是作为一个复杂函数调用内部的一个抛弃函数,它需要一个函数作为其输入之一,即:

>> arrayfun(@(x) x^2, 1:10)

ans =

     1     4     9    16    25    36    49    64    81   100

我个人经常使用它们来重构一系列重复性陈述

a = complex_expression(x, y, z, 1)
b = complex_expression(x, y, z, 3)
c = complex_expression(x, y, z, 8)

f = @(n) complex_expression(x, y, z, n)
a = f(1)
b = f(3)
c = f(8)

来自Mathworks的更多info。它们或多或少与Python中的lambda表达式相同。

答案 1 :(得分:0)

@视为匿名,这意味着一个未命名的函数(从技术上讲,在MATLAB中,你必须给它起一个名字,因为你不能这样做,{ {1}},该名称是您为匿名函数分配的任何变量。

语法(@(x, y) x + y)(1, 2)读取:创建一个带参数@(x, y) x + y@的匿名x函数,并返回表达式在下一个右括号后面。在这种情况下,这是yx的添加。

我知道几乎没有人使用MATLAB定期使用的一件事,而是使用y hell而不是repmat(它代表二进制单例扩展)。

使用表达式bsxfun,您基本上bsxfun(@plus, randn(1000, 20), randn(1000, 1))右侧20次形成一个新矩阵,然后传递给repmat函数句柄。你可以通过这种方式传递任何功能。请查看@pluscellfun。它们非常有用。