_3_учебн_пособ_SciLab
.pdf2.РАБОТА С МАССИВАМИ В SCILAB
2.1.Одномерные массивы (векторы)
Для создания одномерного массива из набора чисел удобно использовать операцию конкатенции [] .
Создание массива-строки:
A=[10 20 30] |
или A=[10,20,30] |
|
Если не указать точки с запятой после создания массива,SciLab |
||
выдаст: |
|
|
A = |
|
|
10. |
20. |
30. |
Cоздание массива-столбца: |
||
A=[10 |
или |
A=[10; 20; 30] |
20 |
|
|
30] |
|
|
A= |
|
|
10. |
|
|
20. |
|
|
30. |
|
|
Можно создать пустой массив
P=[]
P =
[]
Для доступа к элементу массива нужно применить операцию индексации. Первый элемент массива обозначается как A(1), второй – A(2), третий – A(3).
Операцию индексации можно применять как слева, так и справа от знака присваивания. При этом осуществляется доступ к элементам массива по записи или по чтению.
Если создавать вектор поэлементным присваиванием, то создаётся столбец
D(1)=1; D(2)=2 D =
1.
2.
Пример записи во второй элемент массива среднеарифметического 1-го и 3-го:
A(2) = ( A(1) + A(3) ) / 2;
Помимо хранения элементов массива SciLab автоматически хранит информацию о размерности, количестве и типе элементов.
Количество элементов в одномерном массиве всегда можно узнать с помощью функции length :
length(А) ans =
3
Для пустого массива эта функция возвращает 0.
2
При чтении несуществующего элемента выдаётся ошибка:
A(4)
!--error 21 invalid index
Однако записать значение в несуществующий элемент можно:
A(4) = 40;
Если предшествующие элементы не существовали, то они заполняются нулями. Для вывода массива достаточно набрать его имя
A А =
10.20. 30. 40.
2.2. Двумерные массивы (матрицы)
Двумерные массивы можно рассматривать как наборы чисел, упорядоченные в виде прямоугольной таблицы.
Создание двумерного массива:
A=[ 1 2 или A=[ 1 2; 3 4; 5 6]
3 4
5 6 ]
A=
1.2.
3.4.
5.6.
Здесь формируется массив A из 3 строк и 2 столбцов – всего 6 чисел. Для разделения строк используется переход на новую строку или точка с запятой.
Размеры двумерного массива определяются функцией size:
S=size(A) // получаем вектор из двух значений (число строк и столбцов)
S =
3.2.
[kstr,kcol]=size(A) // получаем два значения (число строк и столбцов) kcol =
2.
kstr =
3.
Можно использовать size для получения только числа строк или столбцов: kstr = size(A,'r')
kstr = 3
kcol = size(A,'c') kcol =
2
Функция size определяет и число элементов массива (можно использовать функцию length):
kol=size(A,'*') kol =
3
6.
kol=length(A) kol =
6.
В SciLab даже обычные переменные рассматриваются как двумерные массивы размерностью в 1 строку и 1 столбец.
x=1;
size(x) ans =
1.1.
Для доступа к элементу двумерного массива используются два индекса – номер строки и номер столбца.
Поэлементное создание двумерного массива
B(1,1)=10; B(1,2)=20; B(2,1)=100; B(2,2)=200
B=
10.20.
100. 200.
Возможно обращение к двумерному массиву, как к одномерному:
B(2)
ans=
100.
SciLab хранит элементы массива в памяти упорядоченно по столбцам: сначала располагаются элементы первого столбца, затем – второго столбца и т. д.
2.3. Функции SciLab для создания массивов
Можно сразу создать массив с нулевыми или единичными элементами,
используя функции zeros или ones: |
|
|||
C=zeros(2,3) |
I=ones(2,2) |
|||
C = |
|
|
I = |
|
0 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
1 |
Эти функции создают одномерный массив, если один из их аргументов 1.
Функция eye создаёт диагональную единичную матрицу
eye(3,3) |
|
|
ans = |
|
|
1 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
Заполнение элементов матриц случайными числами с равномерным распределением в диапазоне [0 1] обеспечивает функция rand
rand(2,3) ans =
0.2113249 0.0002211 0.6653811
4
0.7560439 0.3303271 0.6283918
Если аргументом функций zeros, ones, eye и rand задан массив (число, вектор или матрица), они возвращают массив той же размерности:
T=[1 2 3 4 5]
T0=zeros(T) T0 =
0.0. 0. 0. 0.
2.4.Арифметические операции и функции с массивами
Вязыке системы SciLab допускаются групповые арифметические операции с массивами.
Над массивами одинаковой размерности допускаются операции: + поэлементное сложениепоэлементное вычитание
.* поэлементное умножение
./ поэлементное деление
.^ поэлементное возведение в степень
Пример
A=[ 1 2 3 4 ]; B=[10 20 30 40]; C=A+B
C=
11.22. 33. 44.
Если используются операнды разных размеров, выдаётся сообщение об ошибке. Исключением является случай, когда один из операндов не массив (скаляр).
C+5 ans =
16.27. 38. 49.
Здесь число 5 предварительно преобразуется в массив той же длины, что и С, с элементами, равными 5, и складывается поэлементно с массивом С.
Все математические функции системы SciLab могут принимать в качестве аргумента и возвращать массив любой размерности:
F=[ 4 9 16 25];
sqrt(F) ans =
2. 3.
4.5.
Вэтом примере функция sqrt() создаёт массив, каждый элемент которого есть корень из соответствующего элемента массива F.
5
2.5.Матричные операции
ВSciLab допустимы операции, использующие матричную арифметику: det(Y) – вычисление определителя матрицы Y
inv(Z) – вычисление матрицы, обратной к Z (эквивалентно Z^(-1) ) X.’ – транспонирование матрицы X
A*B – матричное умножение матриц A и B
A^3 – возведение квадратной матрицы в степень ( A*A*A) A\B – аналог операции inv(A)*B
A/B – аналог операции A*inv(B)
2.6.Действия с векторами и матрицами
1. Склеивание массивов.
A=[1 2 3];
M=[10 20];
M=[M A]
M=
10.20. 1. 2. 3. [A 5 A 4]
ans =
1.2. 3. 5. 1. 2. 3. 4. A = [ 1 2
3 4 ]; B = [ 5 6
7 8 ];
C=[A B] |
или |
C=[A,B] |
C = |
|
|
1.2. 5. 6.
3.4. 7. 8.
C1=[ A |
или C1=[ A; B ] |
B ] |
|
C1= |
|
1.2.
3.4.
5.6.
7.8.
2.Взятие части массива.
X = [ 10 20 30 40 50] ;
X (2:4) // задаём диапазон индексов ans =
20. 30. 40.
Y = X(1:2:4) // задаём диапазон индексов с шагом
Y =
10. 30.
6
X(3:length(X)) // задаём дипазон с третьего до последнего ans =
30. 40. 50.
Z=X(length(X):-1:1) // шаг индекса может быть отрицательным
Z =
50. 40. 30. 20. 10.
C1(1:3,:) // здесь из С1 берётся подматрица с первой по третью строку ans =
1. 2.
3. 4.
5. 6.
Y=C(:,2:size(C,'c')) // в Y записывается подматрица со 2 // по последний столбец
Y =
2. 5. 6.
4. 7. 8.
Х=C(size(C,'r'),1:2:size(C,'c')) // В Х записываются элементы последней // строки стоящие на нечётных местах
Х =
3.7.
3.Удаление элементов массива
C=[0 0.5 1 1.5 2]; C(2)=[]
C =
0.1. 1.5 2.
C(2:3)=[]
C=
0.2.
D=[-1 -2 -3 -4 -5]; D(1:2:length(D)) = [ ] D =
-2. -4.
Z(1,:)= [ ]; // удаление первой строки
Z(:,2)= [ ]; // удаление второго столбца
Z(1:2,:)=[ ]; // удаление первых двух строк
1. Формирование одномерных массивов в виде арифметической прогрессии.
V=[1:5]
V=
1.2. 3. 4. 5.
Шаг изменения элементов можно задать произвольным (даже отрицатель-
ным):
W=[7:-2.5:1]
W=
7.4.5 2.
7
5. Задание значений группе элементов массива:
D=[1 2 3 4; 5 6 7 8]
D=
1.2. 3. 4.
5. 6. 7. 8. D(1:2,2:3)=10
D =
1.10. 10. 4.
5.10. 10. 8.
2.7.Множественная индексация массивов
На самом деле взятие части массива с помощью диапазона индексов – это есть частный случай множественной индексации.
1. Пусть нужно из вектора V1=[9 8 7 6 5 4 3 2 1] сформировать вектор V2, состоящий из 2-го, 4-го, 7-го элементов:
V2=V1([2 4 7]) или Ind=[2 4 7]; V2=V1(Ind)
V2=
8. 6. 3.
Здесь вместо скалярного индекса подставляется вектор, содержащий набор индексов.
Множественная индексация обеспечивает не только более компактную запись, но и большее быстродействие вычислений.
С помощью множественной индексации можно продублировать некоторые элементы массива и даже переставить их местами.
V2=V1([8 8 8 2 2 6]) V2 =
2. 2. 2. 8. 8. 4.
Если V1 столбец, то и результат V2 будет столбцом.
2. В качестве индекса можно использовать матрицу:
V=[10 20] I=[ 1 1
22
22
1 1];
A=V(I)
Здесь A – матрица-строка, элементы которой берутся из V посредством индексирования сначала 1-го, а затем 2-го столбца индексов.
A =
10.20. 20. 10. 10. 20. 20. 10.
Если вместо строки V взять столбец, то после индексации его матрицей I получим A в виде столбца.
3. Если индексируется матрица (двумерный массив), то элементы исходной матрицы и матрицы-индекса берутся в порядке их расположения в памяти столбцам, а результат всегда выводится в виде столбца.
8
A =[ 10 |
20 |
30 |
40 |
50 |
60 |
70 |
80 |
90]; |
Ind =[ 4 |
5 |
6]; |
A(Ind) |
|
|
ans = |
|
|
20. |
|
|
50. |
|
|
80. |
|
|
Ind =[ 1 |
2 |
3 |
7 |
8 |
9]; |
F=A(Ind) F =
10.
30.
40.
60.
70.
90.
4. Рассмотрим множественную индексацию двумя индексами.
A= [ 1 2 3 4 5 6];
B=A([1 3],1:2) B=
1. 2.
5. 6.
Mожно легко поменять местами строки или столбцы
F=[1 2 3 4 5 6 7 8 9];
F=F(:,[3 1 2])
Здесь последний столбец ставим на первое место, первый – на второе:
F=
3. 1. 2.
6. 4. 5.
9. 7. 8.
Размер результата определяется количеством индексов при индексировании
E=F([2 3 3 2], [2 1 3 2 1]) E=
4. 6. 5. 4. 6.
7. 9. 8. 7. 9.
7. 9. 8. 7. 9.
4. 6. 5. 4. 6.
9
Вопросы и задания к главе 2
1. Напишите, что и как будет выведено после выполнения в SciLab:
а) clear; X(4)=5 б) Z(2,3)=5 в) A(1)=10; A(3)=30 г) X=[]; length(X)
2.Поясните все варианты использования функции size.
3.Задан массив M=[10,20,30,40;1,2,3,4;5,6,7,8]. Чему равно значение K?
а) K=length(M)*size(M,'*') б) K=M(5)-M(3,2) в) K=M(1,3)+M(6)
4.С помощью функции создайте:
а) квадратную единичную матрицу; б) строку из пяти элементов, состоящую из нулей;
в) столбец из 10 элементов, состоящий из единиц; г) квадратную матрицу 7-го порядка, состоящую из случайных чисел в
диапазоне от 0 до 100 .
5.Напишите, что и как будет выведено после выпонения в SciLab: а) H=[12;53;92;25]; J=[3 4 2 1]; T=H(J)
б) Z=[11 22 33 44]; K=[1 2 4 3; 2 1 3 4]; G=Z(K)
в) S=[34,74,-23;82,12,30;45,-33,-72]; U=[7 3 8 5]; B=S(U) г) M=[ 2 -7 3 5;3 9 -3 4; -1 2 0 -2]; F=M([2 3 2 1],[3 1])
6.Сформируйте массив, состоящий из элементов: 30 26 22 18 14 10 6 2 -2 -6 .
7.Даны два одномерных массива A и B. Изменить массив A так, чтобы в нём сначала были элементы B, затем значение 0, а затем все элементы A.
8.Удалите из массива элементы, стоящие на местах, кратных трём.
9.Даны одномерные массивы A и B. Изменить массив A так, чтобы в нём был сначала последний элемент B, затем все элементы A, затем первый элемент B.
10.Задан одномерный массив. Замените элементы со 2-го по 5-й значениями 20
3040 50 .
11.Задан одномерный массив. Измените его так, чтобы он содержал только элементы, стоящие на чётных местах, но в обратном порядке.
12.Заданы одномерные массивы X и Y. Замените последние пять элементов массива Y на первые пять элементов массива X.
13.Удалить из матрицы R первую строку и последний столбец.
14.Даны две квадратные матрицы X и Y одинаковой размерности, содержащие чётное количество столбцов. Замените все чётные столбцы в X на все нечётные столбцы Y.
15.Дана квадратная матрица 5-го порядка. Удалить из неё все элементы, кроме квадратной подматрицы из элементов с третьей по пятую строку и одновременно с первого по третий столбец.
16.Дана матрица B. Создать матрицу, состоящий из двух строк: первая ее строка – последняя строка B, а вторая строка – первая строка B.
17.Даны матрицы M и N одинаковой размерности. Создать матрицу G такой же размерности, каждый элемент которой равен квадрату произведения соответствующих элементов M и N.
18.Даны матрицы A и B с одинаковым числом строк. Составить матрицу C, состоящую из двух столбцов, первый столбец которой есть последний столбец матрицы A, а второй – первый столбец матрицы B.
10
4.ОПЕРАЦИИ. ОБРАБОТКА МАССИВОВ
4.1.Операции отношения
Операции отношения предназначены для сравнения двух операндов.
>больше
>= больше или равно
<меньше
<= меньше или равно
==равно
<> не равно ( либо ~=)
Эти операции являются бинарными, т. е. используются с двумя операндами. Результатом операции отношения будет логическое значение T (true ис-
тина) или F (false ложь): a=1; b=2;
c=a<b // логическая переменная c получает значение T c =
T
Логические константы в выражении записываются со знаком процента: d1=%T // логическая переменная d1 получает значение T
d1 =
T
d2=%F; // логическая переменная d2 получает значение F d2 =
F
В арифметических выражениях истина T преобразуется в 1, а ложь F в 0:
%T+6 ans =
7
Арифметические операции имеют приоритет выше, чем операции отношения:
3<>1+2 // здесь сначала выполняется сложение, а затем сравнение ans =
F
Для изменения порядка выполнения операций используют круглые скобки. x=(-5<=0)+5 // 1 + 5
x =
6
4.2. Логические операции
Логические операции используются в условных операторах и циклах.
Бинарные операции (должны иметь два операнда)
&«И»
|«ИЛИ»