Progress-servis55.ru

Новости из мира ПК
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Matlab глобальные переменные

Matlab глобальные переменные

5. Видимость имён переменных и имён функций.

Локальные и глобальные переменные. Функция располагает собственным, изолированным от рабочего пространства системы MATLAB, пространством переменных. Поэтому, если перед вызовом M-функции в командном окне MATLABа была определена переменная с именем, например, varName1, то нельзя рассчитывать на то, что переменная в теле функции с этим же именем уже имеет некоторое значение. Это совсем другая переменная ( хотя у неё и то же самое имя varName1 ) и располагается она в памяти машины в другой области памяти.

Переменные, которые используются в теле M-функции и не совпадают с именами формальных параметров этой функции, называются локальными. По-другому говорят, что они видимы лишь в пределах M-функции. Извне они не видны ( не достижимы ). Внутри функции не видны переменные, определённые в командном окне MATLABа — они являются внешними по отношению к функции и не видны в ней.

Аналогично, локальные внутри некоторой функции переменные не видны внутри другой M-функции.

Одним из каналов передачи информации из командного окна системы MATLAB в M-функцию и из одной функции в другую является механизм параметров функции. Другим таким механизмом являются глобальные переменные.

Чтобы рабочая область системы MATLAB и несколько M-функций могли совместно использовать переменную с некоторым именем, её всюду нужно объявить как глобальную с помощью ключевого слова global. К примеру, переменная glVarS, участвующая в вычислениях в рабочем пространстве и в функции FuncWithGlobVar является одной и той же переменной ( единственный участок памяти ) повсюду — поэтому её можно использовать в функции без дополнительного присваивания её какого-либо значения:

Так как у глобальных переменных «глобальная» область действия, то чтобы случайно ( по ошибке ) не переопределить её где-либо, желательно давать таким переменным более мнемонические ( более длинные и осмысленные ) имена.

Теперь рассмотрим вопрос о видимости имён функций. Если мы сохранили функцию с некоторым именем в файле с этим же именем и расширением m, и кроме того если системе MATLAB известен путь к этому файлу на диске, то эту функцию можно вызывать как из командного окна, так и из других функций.

Однако в тексте M-функции можно поместить опеределения нескольких функций, причём только одна из них может совпадать по имени с именем файла. Именно эта функция и будет видна из командного окна и других функций. Все остальные функции будут внутренними — их могут вызывать только функции из того же файла.

Например, если в файле ManyFunc.m будет содержаться следующий текст

function ret1 = ManyFunc( x1, x2 )

ret1 = x1 .* x2 + AnotherFunc( x1 )

function ret2 = AnotherFunc( y )

ret2 = y .* y + 2 * y + 3;

состоящий из определений двух функций с именами ManyFunc и AnotherFunc, то извне можно вызывать только функцию ManyFunc. По-другому можно сказать, что извне видны только функции с именами, совпадающими с именами M-файлов. Остальные функции должны вызываться этой функцией и другими внутренними функциями.

Иллюстрированный самоучитель по MatLab

Статус переменных и команда global. Использование подфункций. Частные каталоги.

Итак, из сказанного ясно, что переменные в файлах-сценариях являются глобальными, а в файлах-функциях – локальными. Нередко применение глобальных переменных в программных модулях может приводить к побочным эффектам. Применение локальных переменных устраняет эту возможность и отвечает требованиям структурного программирования.

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

Команда global var1 var2… позволяет объявить переменные модуля-функции глобальными. Таким образом, внутри функции могут использоваться и такие переменные, если это нужно по условиям решения вашей задачи [Чтобы несколько программных модулей могли совместно использовать глобальную переменную, i идентификатор должен быть объявлен как global во всех модулях.].

Использование подфункций

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

В этом примере среднее значение элементов вектора х вычисляется с помощью подфункции avg(x.n), тело которой записано в теле основной функции statv. Пример использования функции statv представлен ниже:

Подфункции определены и действуют локально, т. е. только в пределах m-файла, определяющего основную функцию. Команда help name выводит комментарий, относящийся только к основной функции, тогда как команда type name выводит весь листинг m-файла. Так что заданные в некотором m-файле подфункции нельзя использовать ни в командном режиме работы, ни в других т-файлах. При обращении к функции интерпретатор системы MATLAB прежде всего просматривает m-файл на предмет выявления подфункций. Если они обнаружены, то задаются как локальные функции. Благодаря локальному действию подфункций их имена могут совпадать с именами основных функций системы. Если в функции и подфункциях должны использоваться общие переменные, их надо объявить глобальными как в функции, так и в ее подфункциях.

Читать еще:  Как пользоваться matlab

Частные каталоги

Для записи m-файлов используются каталоги, называемые родительскими каталогами. Они содержат группы файлов определенного функционального назначения, например по статистическим расчетам, матричным операциям, вычислению определенных классов функций и т. д.

Однако начиная с версии MATLAB 5.0 появилась возможность в родительских каталогах создавать частные каталоги с именем PRIVATE. Расположенные в них m-файлы доступны только файлам родительского каталога. Файлы частных каталогов просматриваются интерпретатором системы MATLAB в первую очередь. Применение частных каталогов позволяет изменять исходные файлы, сохраняя оригиналы в родительском каталоге в неизменном виде.

Если вы решили отказаться от применения измененного файла, достаточно стереть его в частном каталоге. Такая возможность связана с тем, что интерпретатор при поиске m-файла прежде всего просматривает частный каталог и интерпретирует найденный в нем файл. И только если файл не найден, ищется файл в родительском каталоге.

Система математических расчетов MATLAB (стр. 22 из 30)

Как MATLAB передает аргументы функции

С точки зрения программиста создается впечатление, чтоMATLAB передает функции все ар-гументы в виде их значений. В действительности, однако, MATLAB передает значения толь-ко тех аргументов, которые изменяются данной функцией. Если функция не изменяет соот-ветствующий аргумент, а просто использует его при вычислениях, MATLAB передает аргу-мент в виде ссылки на него (на его расположение в памяти) с целью оптимизации использо-вания памяти.

Рабочие пространства функций

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

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

Проверка числа аргументов функции

Функции nargin и nargout позволяют вам определить число входных и выходных аргумен-тов функции. Вы можете использовать эти функции с условными операторами для выполне-ния различных задач в зависимости от числа аргументов. Например,

function c = testarg1(a,b)

elseif (nargin == 2)

При одном входном аргументе, данная функция вычисляет квадрат входной величины. Если заданы два входных аргумента, функция осуществляет их сложение.

Передача переменного числа аргументов

Функции varargin и varargout дают возможность передачи функции любого переменного числа аргументов или возвращать переменное число выходные аргументов. При использова-нии функци varargin MATLAB объединяет все заданные входные аргументы в массив яче-ек. Если вы используете функцию varargout, то ваша программа должна обеспечить объе-динение выходных переменных в массив ячеек, с тем чтобы MATLAB имел возможность вернуть их в пространство вызова. Ниже дан пример функции, которая принимает любое число двумерных векторов, и наносит на графике линию, соединяющую соответствующие точки.

function testvar (varargin)

for i = 1:length (varargin)

axis([xmin fix(max(x)) + 3 ymin fix(max(y)) + 3])

Функция testvar рабоает с различным числом входных переменных; например, вы можете ввести два различных набора данных

testvar ([2 3], [1 5], [4 8], [6 5], [4 2], [2 3])

testvar ([–1 0], [3 –5], [4 2], [1 1])

Распаковка содержимого функции varargin

Поскольку функция varargin содержит все входные аргументы в виде массива ячеек, для из-влечения данных необходимо использовать соответствующую индексацию. Например,

Индексация ячеек имеет два набора компонент – первый набор указывает ячейку и заключен в фигурные скобки, а второй набор относится к содержимому ячейки и заключен в обычные скобки. В приведенном выше операторе выражение <i> обозначает обращение к i-ой ячейке в varargin, а выражение (2) представляет второй элемент содержимого выбранной ячейки.

Упаковка выходных переменных в функцию varargout

Когда вы хотите использовать произвольное число выходных аргументов, вы должны преду-смотреть процедуру упаковки выходных переменных в массив ячеек varargout. При этом, для определения конкретного числа вызываемых выходных аргументов используйте функ-цию nargout. Например, приведенный ниже пример принимает входной массив в виде двух столбцов, где первый столбец характеризует набор данных по оси x, а второй столбец – соот-ветствующий набор данных по оси y . Данные наборы разбиваются на отдельные пары век-торов [xi yi], которые вы можете передать описанной выше функции testvar.

Читать еще:  Length matlab описание

function [varargout] = testvar2 (arrayin)

for i = 1:nargout

varargout = arrayin (i, 🙂

Оператор присваивания в цикле for использует синтаксис индексации массивов ячеек. Вот пример применения функции testvar2:

[p1, p2, p3, p4, p5] = testvar2 (a);

Функции varargin или varargout должны быть последними в списке аргументов, при этом они могут быть расположены после любого числа входных или выходных переменных. Это значит, что в строке определения функции следует сперва указать требуемые входные или выходные аргументы. Например, следующие строки определения функций показывают правильное применение varargin и varargout.

function [out1,out2] = example1(a,b,varargin)

function [i,j,varargout] = example2(x1,y1,x2,y2,flag)

Локальные и глобальные переменные

Каждая исполняемая функция MATLAB-а, определенная некоторым М-файлом, имеет свои собственные локальные переменные расположенные в своем рабочем пространстве, которые отделены от локальных переменных других функций и переменных в основном рабочем про-странстве. Однако, если несколько функций и, возможно, основное рабочее пространство, объявляют некоторую конкретную переменную глобальной, то все эти функции и основное рабочее пространство будут иметь доступ к данной переменной. Любое изменение глобаль-ной переменной, произведенное в пространстве какой-либо одной функции, немедленно воспринимается всеми остальными функциями, где эта переменная объявлена глобальной. Допустим, вы хотите изучить эффект изменения коэффициентов взаимосвязей a и b, в диф-ференциальном уравнении Лотки-Вольтера (Lotka-Volterra), известного как модель хищника-жертвы.

function yp = lotka(t,y)

global ALPHA BETA

Затем введем последовательно в командное окно следующие выражения

global ALPHA BETA

Объявление переменных ALPHA и BETA глобальными в командной строке позволяет ме-нять соответствующие значения внутри функции заданной файлом lotka.m. Интерактивное изменение данных переменных в командном окне приводит к получению новых решений без каких-либо редактирований текста файла.

Для работы в ваших приложениях с глобальными переменными следует:

— Объявить соответствующую переменную глобальной в каждой функции, где пре-дусмотрено ее использование. Для обеспечения доступа к глобальной переменной из командного окна нужно объявить данную переменную глобальной также и в командной строке.

— В каждой функции объявите переменную глобальной до первого появления ее имени в тексте файла. Обычно рекомендуется объявлять переменные глобальными в начале М-файла.

Глобальные переменные в MATLAB-е обычно имеет более длинные имена и иногда записы-ваются заглавными буквами.Это не является настоятельным требованием, но упрощает чте-ние файлов и уменьшает риск случайного изменения глобальной переменной.

Перманентные переменные (Persistent Variables)

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

Для работы с перманентными переменными в MATLAB-е предусмотрены три функции:

mlockИсключает возможность удаления М-файла из памятиmunlockВозвращает М-файлу возможность его удаления из памятиmislockedУказывает, может ли М-файл быть удален из памяти

Несколько функций возвращают важные специальные значения, которые вы можете исполь-зовать в ваших М-файлах.

Возвращаемое значениеПоследний ответ (переменная). Если вы не присваиваете выходной переменной или вычисляемому выражению какое-либо имя, MATLAB автоматически запоминает результат в переменной ans.Относительная точность вычислений с плавающей запятой. Это допуск, который MATLAB использует при вычислениях.Наибольшее число с плавающей запятой.Наименьшее число с плавающей запятой.3.1415926535897.Мнимая единица.Бесконечность. Вычисления вида n/0 где n – любое ненулевое реально число, дает в результате inf.Не численное значение (Not-a-Number). Выражения вида 0/0 и inf/inf дают в результате NaN, так же как и арифметические операции содержащие NaN. Выражения типа n/0, где n явля- ется комплексным числом, также возвращают NaN.Тип компьютера.

Строка, содержащая версию MATLAB-а.

Вот несколько примеров, где используются эти переменные.

Matlab: реальные глобальные переменные

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

Моя проблема заключается в том, что у меня есть файл данных biig, который я хочу загрузить только один раз, чтобы я мог повторно запустить свой код во время разработки, не тратя время на повторную загрузку данных. Это не проблема в моей текущей структуре с одним большим скриптом без внутренних функций. Одним из решений является наличие двух файлов сценариев matlab. Один для загрузки данных, а затем вызова функций в другом скрипте.

Читать еще:  Критерий михайлова matlab

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

Итак, мой вопрос заключается в том, как объявить истинную глобальную переменную, как в Примере 2, где я загружаю свои данные один раз, чтобы остаться в рабочей области, вызывая свои функции внутри одного скрипта?

3 Ответа

Используйте входные аргументы, вот для чего они созданы

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

а затем в базовом рабочем пространстве:

Использование постоянных переменных

persistent X Y Z определяет X , Y и Z как переменные, которые являются локальными для функции, в которой они объявлены; однако их значения сохраняются в памяти между вызовами функции. Постоянные переменные похожи на глобальные переменные, потому что программное обеспечение MATLAB создает постоянное хранилище для обоих. Они отличаются от глобальных переменных тем, что постоянные переменные известны только той функции, в которой они объявлены.

Так что вы можете легко использовать:

При первом вызове этой функции в очищенном базовом рабочем пространстве или очищенном function*, набор данных будет загружен. Каждый следующий раз (когда функция не была отредактирована), набор данных уже/все еще будет в памяти.

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

* когда функция очищается вы можете спросить?

Всякий раз, когда вы очищаете или изменяете функцию, которая находится в памяти, MATLAB также очищает все постоянные переменные, объявленные этой функцией. Чтобы сохранить функцию в памяти до завершения MATLAB, используйте mlock .

Это не дубликат объявления глобальных переменных в matlab. Глобальный var доступен только для всех функций, но когда скрипт завершен, глобальные переменные исчезли, и мне нужно снова прочитать их в память.

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

Глобальные переменные должны объявляться везде, где они используются. Просто добавьте global data туда, где вам это нужно, и он будет работать.

Похожие вопросы:

Я использую рекурсивную функцию в Matlab, где некоторые переменные требуются на каждом уровне, они не меняются. Хотя некоторые изменения в функциях, а также должны быть отражены в основной.

Возможные Дубликаты : Почему в Java нет глобальных переменных? Глобальные переменные в Java Привет, Есть ли способ объявить глобальные переменные в java? или что-то с таким же широким размахом, как.

Возможный Дубликат : Где поместить глобальные переменные в Rails 3 Можно ли установить глобальные переменные всего сайта в Ruby на Rails?

Как я могу увидеть список того, какие глобальные переменные определены в MATLAB? (Я использую R2009a). Я безрезультатно охотился за этим в Google и SO, поэтому прошу прощения, если это было задано.

Могу ли я объявить глобальную переменную в matlab, которая имеет тип single? Насколько мне известно, глобальные переменные по умолчанию принимают размер как двойной

Я пытаюсь использовать Python, как это было бы в Matlab. В основном у меня есть некоторый код Python, для которого я запустил, и он сгенерировал некоторые глобальные переменные. Скажи, а = 5 b = 3 Я.

Я определяю переменную d следующим образом global d d = 4; Однако, когда я позже вызываю эту переменную в функции, она не распознается Undefined function or variable ‘d’. Разве не так объявляются.

В последнее время я потратил некоторое время на создание сложного инструмента Matlab GUI. Я использую GUI builder GUIDE. Мне не нравится, как Matlab управляет глобальными переменными в коде позади.

Я создал GUI для установки параметров и использования этих параметров в другом m-файле. Я знаю, что переменные, созданные в GUI, находятся в другой рабочей области от входных переменных до m-файла.

Можно ли объявить глобальные переменные в MATLAB внутри цикла: cellvar = < 'ni' ; 'equity' ; 'assets' >; for i = 1:size(cellvar,1) global cellvar <1>% —> THIS GIVES AN ERROR end % Desired.

Ссылка на основную публикацию
Adblock
detector