Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

lection_matlab_all / matlab_6

.pdf
Скачиваний:
19
Добавлен:
27.05.2015
Размер:
213.39 Кб
Скачать

На практике может сложиться ситуация, когда необходимо создать алгоритм для обработки не только данных, но и функций, т.е. входными данными должны быть имена функций. В таких случаях имя файл-функции передаётся через строковую переменную, а её вычисление производится c помощью команды feval. Например, вызов sin(x) эквивалентен вызову feval('sin', x), а операцию

>>[X, Y] = meshgrid(x, y) можно записать как

>>[X, Y] = feval('meshgrid', x, y)

Примечание:

SciLab также использует функции (*.sci) и сценарии (*.sce), причём соглашения о синтаксисе, правилах вызова и видимости переменных аналогичны MatLab, за исключением необходимости завершать тело функции ключевым словом endfunction.

Ключевое отличие — необходимость загружать функции и сценарии в среду SciLab, тогда как MatLab обеспечивает доступ с помощью встроенного механизма поиска файлов в связанных с системой каталогах (см. меню Set Path).

Специфика индексации в MatLab

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

>>v = [1.3 555 7.4000 8.2 0.9];

>>ind = [4 2 5];

>>w = v(ind)

w =

8.2000 555.0000 0.9000

Индексация при помощи двоеточия «:» эквивалентна встроенному циклу, который вычисляет индексы необходимых элементов и одновременно производит их перебор. Предположим, например, что в массиве w, соответствующем вектор-строке из семи элементов, требуется заменить нулями элементы со второго по шестой:

>> w = [0.1 2.9 3.3 5.1 2.6 7.1 9.8];

>>w(2:6) = 0;

>>w

w =

0.1000 0 0 0 0 0 9.8000

С помощью этого механизма индексации можно производить и достаточно сложные вычисления, например:

>>x = 0:.1:5;

>>y = sin(x);

>>z = (y(2:end)-y(1:end-1))./(x(2:end)-x(1:end-1));

>>plot(x, y, 'r', x(2:end), z, 'k')

Важно! Использование индексации массивами не только делает код компактнее, но многократно повышает скорость

его исполнения!

Возможно и так называемое логическое индексирование, когда требуется часть массива, удовлетворяющая определённому условию. Поиск может производится напрямую с помощью указания условия вместо индекса

>>x = rand(1, 3)

x =

0.097131781235848 0.823457828327293 0.694828622975817

>>x(x>0.5)

ans =

0.823457828327293 0.694828622975817

Кроме того можно использовать функцию find, которая возвращает индексы элементов, удовлеиворяющие заданному в аргументе условию, например:

>>x = rand(1, 3)

x =

0.097131781235848 0.823457828327293 0.694828622975817

>>x>.5

ans =

0 1 1 >> find(x>0.5) ans =

23

Некоторые индексные логические матрицы вычисляются по исходным данным при помощи специальных функцийселекторов:

isfinite — единицы соотв. числам, нули — inf и nan isfinf — единицы соотв. inf, нули — числам

isnan — единицы соотв. nan, нули — числам

isprime — единицы соотв. простым числам, нули - остальным isreal — единицы соотв. веществ. числам, нули - остальным

Каждая из них находит логическую матрицу из 0 и 1, соответсвующую размерам исходной матрице, как и обычные проверки на условия вроде x>y.

Соседние файлы в папке lection_matlab_all