Date Редакция Категория sci Теги matlab

У вас есть множество переменных, значения которых нужно передать в функцию, а запись

f(x,y,z,a,b,c,d,e,f,g)

выглядит уродливо. Что делать?

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

Так что же нужно сделать, чтобы не только список параметров стал короче, но и выполнение функции не замедлялось?

1. Упакуем переменные в массив. Сохраним часть переменных a,b,c,d,e,f,g в массиве args

args = [a,b,c,d,e,f,g];

Теперь в функцию передаются не отдельные переменные, а массив

f(x,y,z,args)

Проблема в том, что обращаться к таким переменным внутри функции нужно как к args(1), args(2), ..., а это неудобно. Где-то в начале функции придется поставить переименование

a=args(1);b=args(2);...

но это и лишний код и расходы на его выполнение. Следующий способ передачи данных использует сходный прием, но лишен отмеченного недостатка.

2. Упакуем переменные в структуру. Создаем из нескольких переменных структуру

earth = struct('R',398600.4415e+9,'mu',6378.137e3,'al',0.37);

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

Передача переменных в функцию осуществляется через созданную структуру earth

f(x,y,z,earth)

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

S = pi*earth.R^2;
q_abs = earth.al*q_Sun;
...

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

S = pi*R_earth^2;
q_abs = al_earth*q_Sun;
...

Мы просто вынести "указатель" на Землю в имя структуры. Отсюда принцип эффективной передачи данных -- передаваемые параметры объединяются в смысловые группы и упаковываются в структуры.

Еще один подход к передаче данных в функцию рассмотрен здесь.



Комментарии

comments powered by Disqus