Подтвердить что ты не робот

"Undefined функция 'имя_функции' для входных аргументов типа 'double'."

Вопрос, который появляется довольно часто в разных формах и размерах: Почему появляется следующее сообщение об ошибке:

"Undefined функция 'имя_функции' для входных аргументов типа 'double'."

В этом сообщении делается попытка решить все различные сценарии, в которых может возникать это сообщение об ошибке, и предлагать решения, как это можно решить.

4b9b3361

Ответ 1

Если вы наткнетесь на это сообщение об ошибке и не знаете, что это значит. Успокойся в этом: 90% из нас разобрали ту же самую фразу.

"Undefined функция 'int' для входных аргументов типа 'double'."

Сообщение об ошибке довольно понятно, но все равно может вызвать путаницу. (Я выбрал 'int' наугад, это могло бы быть также как 'train', 'table', 'my_function' или что-то еще).

Существуют два основных случая возникновения этой ошибки:

  • Вы пытаетесь использовать функцию, которая не существует (пока)
  • Вы пытаетесь получить доступ к элементу в переменной, которая не существует (пока)

Что вы будете делать, если получите эту ошибку?

Сначала вы можете попробовать which. Это скажет вам, определена ли функция или переменная, которую вы пытаетесь использовать.

which int
'int' not found.

Совершенно очевидно, что Matlab не может найти никаких функций или переменных с именем int. Попытка использовать его бесполезно. Давайте сравним его с max:

which max
built-in (C:\Program Files\MATLAB\R2014b\toolbox\matlab\datafun\@logical\max)  % logical method

Но вы можете получить следующее, даже если вы получите функцию Undefined "x"...". Если это так, см. Пункт 3 ниже.

which x
x is a variable.

1. Но функция "int" существует! Это даже описанный здесь!

Да, int существует, но только если у вас есть Symbolic Toolbox. Поскольку Toolboxes являются дополнительными пакетами, которые необходимо приобретать отдельно (и могут быть довольно дорогими), скорее всего, у вас нет этого пакета.

Если вы получаете ошибку "Undefined", но найдите функцию в документации, посмотрите в меню слева или просто проверьте адрес. Стандартные функции Matlab имеют такие адреса, как:

mathworks.com/help/matlab/ref/max.html
                   ^^^^^^

Обратите внимание на часть "matlab". Если вы видите это, то вы используете функцию, которая является частью ядра Matlab.

Если, однако, вы видите адрес, такой как один ниже, то функция, которую вы пытаетесь использовать, является частью Symbolic Toolbox:

mathworks.com/help/symbolic/int.html
                   ^^^^^^^^

или, возможно, это часть панели инструментов нейронной сети:

mathworks.com/help/nnet/ref/train.html
                   ^^^^ 

Решение: Найдите другую функцию, которая не входит в набор инструментов, который у вас нет. Скорее всего, вы найдете то, что ищете, если вы опытный гуглер. Если вы не можете найти его, обратитесь за помощью. Объясните, что вы пробовали, и покажите, что вы приложили немного усилий!

2. Но функция задокументирована здесь и является частью основного Matlab!?

Несмотря на то, что функция является частью стандартной установки Matlab и хорошо документирована, вы все равно можете получить эту ошибку. Наиболее вероятной причиной этой ошибки является то, что вы используете более старую версию Matlab. Если вы проверите документацию, в нижней части страницы вы увидите следующее:

Введен в R2013b

Итак, если вы используете R2012b, вы не можете использовать, например, table.

Решение: Проверьте, определена ли функция в вашей версии Matlab. Если он еще не реализован, вам нужно либо обновить Matlab, либо найти другой способ сделать это. Альтернативой table может быть, например, использование ячеек или структур.

3. Но существует переменная "my_variable"! Я создал его в строке выше!

Нет, вы этого не сделали. Скорее всего, вы создали переменную myvariable, my_Variable, my_Variable или что-то подобное в строке выше. Также возможно, что вы создали его, но случайно cleared it.

Решение: Пройдите код. Ищите опечатки, места, где вы случайно очистили переменную и т.д. В редакторе Matlab вы получите следующую строку внизу, если вы отметите переменную: "3 использования" x "найдены", если вы определили и использовали функцию, Вы также получите оранжевую линию под переменными, которые не используются.

4. Но я получаю "y - переменная", когда я набираю which y?

Если вы получили ошибку выше "Undefined function" y ", но which сообщает вам, что y существует, ваше сообщение об ошибке содержит еще несколько строк:

my_function(x)
Undefined function or variable 'y'.
Error in my_function (line 2)
t = x*y; 

>> which y
y is a variable.

Это говорит о том, что у вас есть переменная с именем y в Рабочее пространство Matlab (также проверьте эта ссылка).

Проблема в том, что функции не могут получить доступ к этому рабочему пространству:

Функции не используют базовое рабочее пространство. Каждая функция имеет свое собственное рабочее пространство.

Если вы хотите, чтобы функция увидела и использовала переменную, вы должны передать ее как аргумент . Таким образом, переменная будет частью локальной рабочей области для этой функции. Аналогичным образом, если вы хотите, чтобы переменные, созданные внутри функции, были доступны вне функции, вы должны иметь ее как выход из функции.

Решение: Передайте переменные, которые вы хотите использовать в качестве входных аргументов, к используемой функции. Убедитесь, что имена внутри функций внутренне согласованы. То есть он должен иметь одно и то же имя во всей функции. Обратите внимание, что между именами переменных вне и внутри функции нет связи.

5. Но я передаю переменную как вход в функцию, но я все равно получаю то же сообщение об ошибке!?

Да, вы, вероятно, используете переменную как входную. Однако имена переменных не обязательно одинаковы в разных функциях (чаще всего это не так).

Предположим, что у вас есть функция:

function output = my_function(x)  
output = 2*y;
end

Вы получите ту же ошибку, что и выше, если вы вызываете ее из рабочей области, как в приведенном ниже коде, даже если вы используете y в качестве входной переменной и используете y внутри функции.

y = 3;
res = my_function(y)

Это связано с тем, что внутри функции my_function переменная, которую вы используете для ввода, будет называться x, независимо от того, что она вызывается вне функции.

Решение: Измените имя имени входной переменной в заголовке функции или измените имя переменной во всей функции.

6. Но я создал x как глобальную переменную!?

Во-первых: я рекомендую не использовать глобальные переменные! Гораздо лучше передать переменные в качестве аргументов.

Недостаточно объявить переменную как global в рабочем пространстве Matlab. Он должен быть объявлен в каждой функции, в которой вы его используете. Итак, если у вас есть глобальная переменная x, вам нужно сделать global x в каждой функции.

Решение: Перепишите свой код и передайте переменные в качестве аргументов вместо использования глобальных переменных. Если это не вариант, добавьте global x во все функции, в которых вы его используете.


В дополнение к этому ответу вы можете обратиться к официальному часто задаваемые вопросы по Matlab.