处理函数Matlab

handle function Matlab

我开始在 Matlab 中使用函数句柄,我有一个问题, 当我这样做时,Matlab 会计算什么:

y = (0:.1:1)';
fun = @(x) x(1) + x(2).^2 + exp(x(3)*y)

以及当我这样做时 Matlab 计算的内容:

fun = @(x) x + x.^2 + exp(x*y)

因为我正在计算这些函数的雅可比行列式 (from this code ),它给出了不同的结果。我不明白放 x(i) 或只放 x

的区别

如果您想对此进行调查,我建议您将其拆分为子表达式并进行调试,例如

f1 = @(x) x(1);
f2 = @(x) x(2).^2;
f3 = @(x) exp(x(3)*y);
f  = @(x) f1(x) + f1(x) + f3(x)

如果任何子表达式不清楚,您可以进一步拆分它。

区别在于,一个是数组数组乘法(x * y,我假设x是一个11列的数组,以便矩阵乘法一致),另一个是标量数组乘法(x(3) * y)。任何矩阵的下标运算符 (n) 从该矩阵中提取 n-th 值。对于标量,索引只能为 1。对于一维数组,它提取 column/row 向量的 n-th 元素。对于二维数组,按列遍历时是 n-th 元素。

此外,如果您只需要一阶导数,我建议使用 complex-step 微分。它减少了数值错误并且计算效率高。

让我们将向量 vec 定义为 vec = [1, 2, 3]

当您在第一个函数中将此 vec 用作 results = fun(vec) 时,程序将仅获取向量的特定元素,即 x(1) = vec(1)x(2) = vec(2)x(3) = vec(3)。整个表达式将看起来像

results = vec(1) + vec(2).^2 + exp(vec(3)*y)

或更好

results = 1 + 2^2 + exp(3*y) 

但是,当您将第二个表达式用作 results = fun(vec) 时,它会在所有此类情况下使用整个向量 vec

results = vec + vec.^2 + exp(vec*y)

或更好

results = [1, 2, 3] + [1^2, 2^2, 3^2] + exp([1, 2, 3]*y)

你也可以清楚地看到,在第一种情况下,我真的不需要关心矩阵维度,results变量的最终维度与你的y 变量。在第二个示例中情况并非如此,因为您将矩阵 vecy 相乘,这(在这个特定示例中)会导致错误,因为 vec 变量的维度为 1x3y 变量 11x1.