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

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

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

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

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.

Смотрите также

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте