lection_matlab_all / matlab_6
.pdfНа практике может сложиться ситуация, когда необходимо создать алгоритм для обработки не только данных, но и функций, т.е. входными данными должны быть имена функций. В таких случаях имя файл-функции передаётся через строковую переменную, а её вычисление производится 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.