Логическое индексирование матрицы А логической матрицей L, обозначаемое как А(L), возвращает такие элементы массива А, которые соответствуют позиции в массиве индексирования L и имеют значения %T (True).
При этой операции каждый элемент со значением %T в массиве индексации Lрассматривается как позиционный индекс в массиве A, к которому осуществляется доступ.
Логические массивы позволяют во многих случаях обходиться без операторов цикла (п. 1.5.4), поэтому хороший уровень программирования в среде Scilab требует умения применять логическое индексирование.
Таким образом, если элементы логического массива L, являясь индексами массива A, то они определяют позиции элементов массива A и эта индексация соответствует их позициям в массиве L.
Scilab содержит специальные системные значения для определения переполнения, потери значимости и неопределенности операторов, таких как Inf и NaN. Чтобы помочь выполнять логические тесты для этих специальных значений существуют логические операторы isinf и isnan, поскольку часто элементы массива, имеющие значения NaN, нужно исключить из вычислений.
С помощью операций & и | Scilab позволяет выполнить соответствующие логические операции «и» и «или», причем над элементами всего вектора.
Рассмотрим несколько примеров на использования логической индексации векторов (рис. 1.3.5-1).
--> // Примеры логической индексации
-->
--> vD = [-0.2, 1.0, 1.5, 3.0, -1.0, 4.2, 3.14];
--> // Пример1
-->iV1 = vD>= 0
iV1 =
FTTTFTT
-->
--> // Пример2
-->vP1 = vD(iV1 == %T) // или vP 1 = vD ( vD >= 0)
vP1 =
1. 1.5 3. 4.2 3.14
-->
--> // Пример3
--> vP2 = vD(iV1 ~= %T) // или vP 1 = vD ( vD <= 0)
vP2 =
-0.2 -1.
-->
--> //Пример4
-->vP3 = vD((vD>= 0) & (vD< 3))
vP3 =
4.2 3.14
-->
--> // Пример 5
--> x = [2 -1 0 3 %nan 2 %nan 11 4 %inf]
x =
|
Рис. 1.3.5-1 Примеры логической индексации векторов
ВПримере1 формируется матрица логических индексов iV1, соответствующих условию vD>=0.ВПримере2 возвращаются элементы матрицы i P 1, соответствующие позиции в матрице индексирования ivD и имеющие значения %T. Эти примеры можно проиллюстрировать на рис. 1.3.5-2.
vD iV1 vD |
Рис. 1.3.5-2 Иллюстрация примеров из рис. 1.3.5-2
ВПримере3 возвращаются элементы матрицы vP2, соответствующие позиции в матрице индексирования v D, значения которых %F. ВПримере4 возвращаются элементы матрицы vP3, соответствующие условию, что элементы матрицы v Dположительны и больше 3. В Примере5 формируется матрица х, которая используется в Примере6, для формирования матрицы xvalid путем исключения из матрицы х элементов, имеющих значение NaN.
Рассмотрим пример создания матрицы А размерностью 3×3 и вычисление логической матрицы L, удовлетворяющей условию A>0.5. Далее используя полученную матрицу L для индексирования матрицы A, присвоим соответствующим элементам матрицы A, значение равное 0. Решение данного примера приведено на рис.1.3.5-2.
--> // Пример логического индексирования массива А
-->A = rand(3, 3)
A =
0.7560439 0.6653811 0.685731
0.0002211 0.6283918 0.8782165
0.3303271 0.8497452 0.068374
--> L = A > 0.5
L =
T T T
F T T
F T F
-->A(L) = 0
A =
0. 0. 0.
0.0002211 0. 0.
0.3303271 0. 0.068374
// Более короткое решение A ( A > 0.5) = 0;
Рис. 1.3.5-2 Пример логического индексирования массива А
В Приложении1.3, табл. 1.3.5-1рассмотрены дополнительные примеры логического индексирования матриц, где L является матрицей логических значений.
Использование функции find
В дополнение к примерам, приведенным в Приложении 1.3.5, табл. 1.3.5-1, необходимо знать следующее: чтобы найти такие элементы матрицы, которые удовлетворяют условию, можно использовать функцию find в сочетании с логическим выражением. Например, find(X<5) возвращает линейные индексы для элементов X , которые имеют значения менее 5.
Чтобы непосредственно найти элементы массива X, которые удовлетворяют условию X<5, можно использовать конструкцию X(X<5), и при этом следует избегать таких конструкций как X(find(X<5)), которые необоснованно используют функцию find с логической матрицей.
В Приложении 1.3, табл. 1.3.5-2приведено описание функции find, gsort , vectorfind .
Дата: 2019-11-01, просмотров: 511.