Как функция lu() решает, что возвращать?

Позволять A быть следующей матрицей:

1 3 
2 4

если я позвоню lu( ) Функция и сохранить возвращаемые значения, как это:

[L, U] = lu(A);

MATLAB возвращает L, U так, что L * U = A:

>> L * U

ans =
     1     3
     2     4

Хотя, когда я сохраняю возвращаемые значения, как это:

[L, U, P] = lu(A);

L * U не равно A:

>> L * U

ans =
     2     4
     1     3

так как lu( ) возвращает L, U, P такой, что L * U = P * A

Мои вопросы:

  • Как можно lu( ) Функция знает, сколько возвращаемых параметров я просил?
  • Могу ли я повторить это поведение в моем коде?

2 ответа

Решение

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

Кроме того, вы можете использовать varargout чтобы заполнить ваш список аргументов соответственно.

Например:

function varargout = myfun(a,b)

    switch nargout
        case 1
            varargout{1} = a;
        case 2
            varargout{1} = b;
            varargout{2} = a;
    end

end

При вызове с одним выходным аргументом первый (и единственный) вывод будет a, Когда вызывается с двумя, первый будет b, второй a,

Вы также можете использовать nargoutchk (или в более старых версиях nargchk) утверждать, что количество запрошенных выходных аргументов находится в указанных пределах.

lu делает что-то похожее на это, но реализовано в скомпилированном C, а не в MATLAB.

Да, это может быть воспроизведено с помощью varargout, Точно так же вы можете использовать varargin если вы хотите переменное количество входов.

function varargout = my_fun(a,b,c);
   varargout{1} = b;
   varargout{2} = c;
   varargout{3} = a;
end

Now, this function can be called

x = my_fun(1,2,3)
x = 2

[x, y] = my_fun(1,2,3)
x = 2
y = 3

[x, y, z] = my_fun(1,2,3)
x = 2
y = 3
z = 1

Как отмечает Сэм Робертс, это не поможет вам создать функцию, которая будет вести себя по-разному для разного количества выходов. Если это то, что вы хотите, вы должны проверить nargout в сочетании с оператором switch. Точно так же вы можете использовать nargin если вы хотите изменить поведение в зависимости от количества входных переменных. Пожалуйста, проверьте ответ Сэма Робертса, чтобы увидеть, как это можно сделать.

Другие вопросы по тегам