Вызов глобальных переменных требует смехотворного количества времени для загрузки по сравнению с тем, чтобы не использовать их вообще:
Рассмотрим цикл с 1000 итераций, выполняющий некоторые вычисления с этими переменными: 0,6 с без глобальных переменных (~1000 переменных), 2,2 с с одной определенной глобальной переменной (и другими переменными), 6 с ~1000 глобальных переменных (и с другими переменными). ). Итак, вы видите, что ОПРЕДЕЛЕНИЕ уже одного глобального — это шаг, который значительно замедляет итерации в функции, которая использует глобальные значения, в отличие от того, что они не используются изначально.
Моей текущей проблемой является функция fsolve, которая вызывает другую функцию и, по-видимому, требует глобальных переменных. И это большая проблема для меня. Я читал, что вы можете передавать переменные в функцию по-разному, например, используя структуру, но эту структуру нужно будет «распаковывать» внутри моих итераций, что снова замедляет итерации.
Теперь мой вопрос: я не хочу использовать глобальные переменные. Как я могу обойти их в fsolve? Моя идея состоит в том, чтобы загрузить их перед входом в цикл. Пожалуйста, скажи мне, что я могу здесь что-то сделать.
Спасибо за чтение, пожалуйста, помогите!
ОБНОВЛЕНИЕ I:
% load workspacevars.mat % I'm loading some variables that are going to be used.
one_of_the_variables_that_is_imported = 1;
for loop=1:1000
x(loop,:)=linspace(rand(),1,13); % x is going to change all the time, so I simulate this here
x1=x(loop,1); %
x2=x(loop,2); %
x13=x(loop,13); % shortened so you get the general idea.
result_1 = x1 * one_of_the_variables_that_is_imported
result_2 = x2 * one_of_the_variables_that_is_imported
result_13 = x13 * one_of_the_variables_that_is_imported
end
Итак, еще раз, я не хочу использовать ни глобальные переменные, ни загружать рабочее пространство для передачи переменных, как это сработает?
ОБНОВЛЕНИЕ II:
По запросу, вот очень, очень близкий пример к моей реальной проблеме (пожалуйста, не пугайтесь длины или отображения, код работает, но не слишком эффективен). Опять же, пожалуйста, сосредоточьтесь на основной проблеме, заключающейся в том, что у меня есть ~ 1000 констант, которые я должен вызывать из файла рабочей области .m или с глобальными переменными, и я не хочу этого делать.
**Небольшая модификация: для этой цели больше подходит pastebin: http://pastebin.com/6e1K90fR
ОБНОВЛЕНИЕ III:
большое спасибо @SCFrench!
Я думаю, что только что понял, как ужасно долго глобальные операции занимают по сравнению со структурами! Позвольте мне поделиться с вами этой забавной историей:
Работа в скрипте функции заняла ужасно много времени, я не мог понять почему (какие-то странные лаги!). Пока я не начал редактировать переменные, чтобы они стали структурой, я удалил все определения глобальных переменных и пуф! все голубое исчезло и у меня больше нет лагов в редактировании кода!!! Я не могу поверить в это!
Так что теперь мой план состоит в том, чтобы нажать ctrl+H на каждую переменную, которая у меня есть, и заменить ее на c.Var. Это около 1000 Вар, поэтому я лучше спрошу в последний раз, прежде чем приступить к этой утомительной задаче. Надеюсь потом заработает. Ваш пример был очень хорош, и чем чаще я его читаю, тем больше у меня получается. Не могли бы вы в последний раз объяснить, как константы переменных передаются в лямбду и передаются в myfun? Боюсь, я не знаю термина лямбда в этом контексте и хотел бы лучше понять вас. Я не могу прокомментировать ваш комментарий, поэтому извините за это длинное обновление и большое спасибо заранее!
ОБНОВЛЕНИЕ IV:
Код без глобалов работает Чёртовски ХОРОШО !!!!!! большое спасибо всем, это фантастика. Я сократил общее время с нелепых 20 секунд на итерацию до менее чем одной секунды. что 95% увеличение эффективности!!!
Несмотря на то, что я прыгаю от радости, есть одна вещь, которую нужно скорректировать: один из моих результатов в fsolve успешно повторяется, это нормально. но я включил дальнейшее вычисление в f2 (функция, которую нужно решить), которую не нужно решать, но я все еще хочу, чтобы ее вывод был в моем f1, который вызывает fsolve. Теперь мой код читается
[x,fval,exitflag,output,jacobian] = fsolve(@(x) f2(x, c), x0, options);
хотя я предпочел бы иметь
[x,y,fval,exitflag,output,jacobian] = fsolve(@(x) f2(x, c), x0, options);
но я получаю слишком много выходных параметров как ошибку, когда пытаюсь это сделать. Поэтому мне пришлось прибегнуть к отчаянным мерам и снова вызвать global y, чтобы обе функции знали y. Как еще вы могли бы это сделать, ведь теперь я знаю, насколько ужасны глобальные объекты?
global
? Это правильно? - person David   schedule 01.12.2014fsolve
и эту статью. - person horchler   schedule 01.12.2014