Оператор “:”
Простейшая запись инструкции с оператором " :" выглядит следующим образом:
v = i : j
где i - это минимальное, a j - максимальное значение индекса, причем i<j. В результате будет создан вектор v = (i; i + 1;…; j). Следующий пример демонстрирует создание вектора, элементы которого пробегают значения от 2 до 4:
-->v = 2:4
v =
2. 3. 4.
Расширенный вариант записи оператора " :" позволяет указать приращение индекса, называемое также шагом:
v = i : s : j
где i и j имеют тот же смысл, что и ранее, a s представляет собой шаг. Данная команда создает вектор v = (i; i + s;i + 2s; i + ns), где n - максимальное целое число, такое что i + ns ≤ j. Если (j — i) делится нацело на s, то максимальное значение индекса совпадает с j, в остальных случаях
i + ns < j. Величина шага s может быть как положительной, так и отрицательной,
В следующем примере создается вектор со значениями от 3 до 10 с шагом 2:
-->v = 3 : 2 : 10
v =
3. 5. 7. 9.
Последнее значение в данном случае равно 9, т.е. меньше j=10.
Следующий фрагмент иллюстрирует результат действия оператора " :" при отрицательном значении шага. В первом случае мы создаем вектор значений, убывающих от 10 до 4. Во втором случае результатом выполнения оператора становится пустая матрица, поскольку начальное значение меньше конечного.
-->v = 10 : -2 : 3
v =
10. 8. 6. 4.
-->v = 3 : -2 : 10
v =
[]
Используя вектор значений индекса, можно обращаться к элементам матрицы в определенных диапазонах строк и столбцов, например,
A(i : j , k : 1)
где i, j, k ,1 - начальные и конечные значения индексов. Полный синтаксис
A(i : s : j ,k: t: 1) включает также задание шагов s и t.
Предположим, что А является матрицей размера 4 х 5. Пусть необходимо обратиться к элементам aij, причем i =1, 2, а j = 3, 4. В Scilab для этого потребуется всего одна инструкция, А(1:2,3:4), как показано в следущем фрагменте:
-->А = testmatrix("hilb", 5)
A =
25. - 300. 1050. -1400. 630.
- 300. 4800. -18900. 26880. -12600.
1050. -18900. 79380. -117600. 56700.
- 1400. 26880. -117600. 179200. - 88200.
630. -12600. 56700. -88200. 44100.
-->A(1:2, 3 : 4)
ans =
1050. -1400.
-18900. 26880.
В некоторых случаях значения индексов должны вычисляться динамически (например, в рамках цикла). Полученные в результате векторы могут использоваться для адресации элементов матрицы точно так же, как числовые литералы:
A(vi, vj ) ,
Данная запись выделяет элементы матрицы А, индексы которых принадлежат векторам vi и vj. Следующий пример иллюстрирует эту возможность:
-->А = testmatrix("hilb", 5)
А =
25. - 300. 1050. -1400. 630.
-300. 4800. -18900. 26880. -12600.
1050. - 18900. 79380. -117600. 56700.
- 1400. 26880. -117600. 179200. -88200.
630. - 12600. 56700. -88200. 44100.
-->vi =1:2
vi =
1. 2.
-->vj =3:4
vj =
3. 4.
-->A(vi, vj )
ans =
1050. - 1400.
- 18900. 26880.
-->vi = vi + 1
vi =
2. 3.
-->vj = vj + 1
vj =
4. 5.
-->A(vi, vj )
ans =
26880. - 12600.
- 117600. 56700.
Можно составить большое число комбинаций с использованием оператора “:”. Наиболее часто используемые варианты представлены на рис. 11.
Например, следующий фрагмент демонстрирует пример перестановки строк матрицы А посредством оператора " :":
|
Таблица 11: Различные варианты использования оператора " :" для доступа к элементам матрицы. |
-->А = testmatrix("hilb", 3)
А =
9. - 36. 30.
- 36. 192. - 180.
30. - 180. 180.
-->А([1 2] , :) = А([2 1] , :)
А =
- 36. 192. - 180.
9. - 36. 30.
30. - 180. 180.
Обменять местами столбцы матрицы А можно при помощи инструкции А (: , [3 1 2]).
В этом разделе нами были рассмотрены несколько важных с практической точки зрения вариантов использования оператора " :". Оператор " :" повсеместно используется при написании программ, для которых скорость выполнения имеет решающее значение. Именно использованием оператора
" :" достигается векторизация скриптов - одна из ключевых возможностей Scilab, которой уделено особое внимание и в настоящем документе.