Неожиданные результаты от совпадения имeн переменных и функций

Если у вас есть функция, которая загружает данные из MAT-файла и обнаруживает, что MATLAB® не возвращает ожидаемые результаты, проверьте, имеют ли какие-либо переменные в MAT-файле то же имя, что и функция MATLAB. Общие имена переменных, которые конфликтуют с именами функции, включают i, j, mode, char, size, и path.

Эти неожиданные результаты происходят, потому что, когда вы выполняете функцию, MATLAB предварительно обрабатывает весь код в функции перед ее запуском. Однако вызовы на load не обработаны предварительно, что означает, что MATLAB не знает переменных в вашем MAT-файле. Переменные, которые имеют то же имя, что и функции MATLAB, поэтому предварительно обработаны как функции MATLAB, вызывая неожиданные результаты. Это отличается от скриптов, которые MATLAB предварительно обрабатывает и выполняет линию за линией, подобно Командному окну.

Например, рассмотрим MAT-файл с переменными height, width, и length. Если вы загружаете эти переменные в функцию, такую как findVolumeMATLAB интерпретирует ссылку на length как вызов MATLAB length function, и возвращает ошибку.

function vol = findVolume(myfile)
  load(myfile);
  vol = height * width * length;
end
Error using length
Not enough input arguments.

Чтобы избежать путаницы, при определении функции выберите один (или несколько) из следующих подходов:

  • Загрузите переменные в массив структур. Для примера:

    function vol = findVolume(myfile)
      dims = load(myfile);
      vol = dims.height * dims.width * dims.length;
    end
  • Явным образом включите имена переменных в вызов load функция. Для примера:

    function vol = findVolume(myfile)
      load(myfile,'height','width','length')
      vol = height * width * length;
    end
  • Инициализируйте переменные в функции перед вызовом load. Чтобы инициализировать переменную, назначьте ее пустой матрице или пустому символьному вектору. Для примера:

    function vol = findVolume(myfile)
      height = [];
      width = [];
      length = [];
      load(myfile);
      vol = height * width * length;

Чтобы определить, связано ли конкретное имя переменной с функцией MATLAB, используйте exist функция. Значение возврата 5 определяет, что имя является встроенной функцией MATLAB.

См. также

Похожие темы