2014-11-21 3 views
0

У меня есть старый код от разных авторов, который использует глобальные переменные в течение многих лет и следующую проблему: я импортировал несколько (> 200) переменных из файла excel. Они не находятся внутри функции, и они не обозначены как глобальные. Для работы функции они должны быть потому, что есть одна функция1, которая вызывает функцию 2. Функция 1 вызывается один раз, только когда функция 2 вызывается> 10000 раз, поэтому я хочу, чтобы что-то глобальное было внутри функции 1. Как я могу легко превратить их в глобальные переменные и передать их функции 2?Включить все текущие переменные рабочего пространства в глобальные переменные

пример (схема)

% function1 
% global *other variables exist here already* 
% this function calls function2 at a certain point further below 

L=whos 
save L % some variables a b c ... are parameters in function2 

% function2 
% global *other variables exist here already* 

load L % i dont want to load my workspace everytime, I rather wish to just access global variables a b c... 
% the problem is that my variables sometimes change name and I want to have 
% them all global in an automatic way. Or live with a workaround. 

Спасибо за ваше терпение и я готов отвечать на вопросы!

UPDATE I:

мне удалось обойти с помощью которого им не совсем доволен, потому что она включает в себя ручной манипуляции в коде. Так что это временное решение в лучшем случае.

% позволяет сказать, что у вас есть переменные рабочего пространства, и вы сохраняете их под этим именем, а затем загружаете их: load workspacevars.mat;

L = кто% дают имена вариабельному как строки столбец L = L»% и в такой форме, которая делает вас возможность использовать его в качестве глобальных (в строке)

%, к сожалению, с использованием глобальной L не работает для меня. есть идеи? % Мне нужно было перейти в L в рабочей области и нажать и перетащить полученную длинную строку в текстовый редактор. % там, я удалил фигурные скобки {} и '', потому что так глобально нравится иметь свои переменные: чистые.

%, наконец, это выглядит следующим образом: глобальный var1 var2 var3 ....

+2

Связанный: http : //stackoverflow.com/q/26361946/2777181 –

+1

Не могли бы вы объяснить комментарий «проблема в том, что мои переменные иногда меняют имя»? – TroyHaskin

+1

Если вы используете [вложенные функции] (http://www.mathworks.com/help/matlab/matlab_prog/nested-functions.html?refresh=true), переменные разделяются между 'function1' и' function2' как долго поскольку 'function2' не объявляет их как входные данные. – TroyHaskin

ответ

0

Ответ, использование структуры файлов вместо глобалов.

Как только структура создается, (c.constant1, c.constant2 ...), вы просто задаете эту функцию c. Я привык работать с рабочими много, что объясняет, почему я сохранить рабочее пространство и загрузить его один раз (а не много раз, так как константы Dont изменить), так это то, как он выглядит для меня:

mainfunction 
c.constant1=1; 
save c.mat 
[Time,Results] = ode15s(@(x, c) f1(x, c),[0 c.length],x0,options) 
end 
function [OUTPUT] = f1(t, x, c) 
load c.mat 
end 

входов х и с и они могут свободно делиться между основной и подфункцией. Если константы должны измениться из-за некоторых событий в функции, они могут быть сохранены с условиями if внутри подфункции и перезагружены на следующей итерации кода (но это еще одна проблема, указанная здесь: Change a constant in ODE calculations under particular conditions with a flag)

Смежные вопросы