处理函数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
变量。在第二个示例中情况并非如此,因为您将矩阵 vec
和 y
相乘,这(在这个特定示例中)会导致错误,因为 vec
变量的维度为 1x3
和 y
变量 11x1
.
我开始在 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
变量。在第二个示例中情况并非如此,因为您将矩阵 vec
和 y
相乘,这(在这个特定示例中)会导致错误,因为 vec
变量的维度为 1x3
和 y
变量 11x1
.