【问题标题】:handle function Matlab处理函数 Matlab
【发布时间】:2020-12-10 08:13:46
【问题描述】:

我开始在 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 的区别

【问题讨论】:

    标签: arrays matlab subscript function-handle


    【解决方案1】:

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

    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 列的数组,以便矩阵乘法保持一致),另一个是标量数组乘法(@987654323 @)。任何矩阵的下标运算符 (n) 从该矩阵中提取第 n 个值。对于标量,索引只能是 1。对于一维数组,它提取列/行向量的第 n 个元素。对于 2D 数组,它是按列遍历时的第 n 个元素。

    另外,如果您只需要一阶导数,我建议使用复步微分。它减少了数值误差并且计算效率很高。

    【讨论】:

      【解决方案2】:

      让我们定义一个向量vecvec = [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.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-19
        • 1970-01-01
        • 1970-01-01
        • 2012-01-30
        • 2014-11-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多