Я хочу передать дескриптор функции в функцию Matlab, которую я сделал - PullRequest
0 голосов
/ 29 апреля 2018

Я пытаюсь передать дескриптор функции в функцию, которую я создал ниже. Я не совсем уверен, как это сделать. Например, как я могу получить:

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

чтобы не ошибка? Если я использую функцию pcg в Matlab таким же образом, она будет работать:

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

1 Ответ

0 голосов
/ 29 апреля 2018

Когда вы делаете

f = @(y) ABC(y)

Вы создаете дескриптор функции. (Обратите внимание, что в этом случае это то же самое, что и f=@ABC). Этот дескриптор является переменной, и он может быть передан функции, но в остальном он такой же, как и функция. Таким образом:

f(1)

- это то же самое, что

ABC(1)

Вы передаете этот дескриптор функции в качестве первого аргумента, который вы назвали matrix. Это вводит в заблуждение, поскольку переменная matrix теперь будет дескриптором функции, а не матрицей. Внутри вашей функции вы можете сделать matrix(y) и оценить функцию для y.

Однако, читая вашу функцию, кажется, что вы воспринимаете вход matrix как фактическую матрицу. Вот почему вы получаете ошибки. Вы не можете умножить его на вектор и ожидать результата!

...