【问题标题】:I want to feed in a function handle into a matlab function I made我想将函数句柄输入到我制作的 matlab 函数中
【发布时间】:2018-10-09 14:34:54
【问题描述】:

我正在尝试将函数句柄输入到我在下面创建的函数中。我不完全确定如何做到这一点。 例如,我如何获得:

conjugate_gradient(@(y) ABC(y), column_vector, initial_guess)

不会出错? 如果我以同样的方式使用 matlab 的 pcg 函数,它将起作用:

pcg(@(y) ABC(y),b,tol).

我尝试阅读 pcg 函数,他们确实在函数描述中考虑了这一点,但是我对 MATLAB 仍然非常缺乏经验,我们应该说难以理解他们所做的事情。谢谢!

function [x] = conjugate_gradient(matrix, column_vector, initial_guess)

    y = [];
    col_size = length(column_vector);
    temp = size(matrix);
    mat_row_len = temp(2);
%         algorithm:

    r_cur = column_vector - matrix * initial_guess;
    p = r_cur;
    k = 0;
    x_approx = initial_guess;

    for i=1:mat_row_len        
        alpha = ( r_cur.' * r_cur ) / (p.' *(matrix* p));
        x_approx = x_approx + alpha * p;
        r_next = r_cur - alpha*(matrix * p);
        fprintf(num2str(r_next'*r_next), num2str(i))
        y = [y; i, r_next'*r_next];
        %exit condition
        if sqrt(r_next'*r_next) < 1e-2
            y
              break;
        end
        beta = (r_next.'* r_next )/(r_cur.' * (r_cur) );
        p = r_next + beta * p;
        k = k+1;

        r_cur = r_next;
    end
    y
    [x] = x_approx;
end

【问题讨论】:

  • 你得到的错误是什么?我怀疑这是因为您的 matrix 参数不是矩阵。您可能需要从函数中获取 返回值 以获得某些输入值 y 并使用它。
  • 如果你的函数ABC(y)返回一个矩阵,而矩阵是conjugate_gradient所期望的,那么你应该这样称呼它:conjugate_gradient(ABC(y), column_vector, initial_guess)。这样,您将矩阵发送到您的函数,而不是函数句柄。

标签: matlab function-handle


【解决方案1】:

当你这样做时

f = @(y) ABC(y)

您创建一个函数句柄。 (请注意,在这种情况下,它与f=@ABC 相同)。这个句柄是一个变量,它可以传递给一个函数,但在其他方面与函数相同。因此:

f(1)

和调用一样

ABC(1)

您将此句柄作为第一个参数传递给一个函数,您称之为matrix。这似乎具有误导性,因为变量 matrix 现在将是函数句柄,而不是矩阵。在您的函数中,您可以执行 matrix(y) 并评估 y 的函数。

但是,在阅读您的函数时,您似乎将matrix 输入视为实际矩阵。这就是你得到错误的原因。你不能将它乘以一个向量并期望得到一个结果!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多