我开始在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)
因为我正在评估这些函数的雅可比矩阵(来自这段代码(,它给出了不同的结果。我不明白放x(I(或只放x 的区别
让我们将向量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
变量的维度相同。第二个示例中的情况并非如此,因为将矩阵vec
和y
相乘(在这个特定示例中(会导致错误,因为vec
变量具有维度1x3
和y
变量11x1
。
如果您想对此进行研究,我建议您将其拆分为子表达式并进行调试,例如
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个值。对于标量,索引只能是1。对于1D阵列,它提取列/行向量的第n个元素。对于二维数组,当按列遍历时,它是第n个元素。
此外,如果你只需要一阶导数,我建议使用复数阶微分。它提供了减少的数值误差并且在计算上是有效的。