Программирование на Octave/Векторы и матрицы
Создание векторов и матриц
[править]Вектор-строка в Octave создается следующим образом:
octave:1> x = [1, 3, 2] x = 1 3 2
Обратите внимание, что:
- вектор заключается в квадратные скобки;
- каждый элемент разделяется необязательной запятой. Так, команда
x = [1 3 2]
вернет точно такой же вектор-строку
Чтобы создать вектор-столбец, замените запятые на точку с запятой:
octave:2> x = [1; 3; 2] x = 1 3 2
Теперь вы, вероятно, поняли, что при определении вектора (матрицы), запятая используется для перехода к следующему столбцу, а точка с запятой - к следующей строке. Итак, определим матрицу, заполняя последовательно её строки, используя запятую, как разделитель значений в строке, а точку с запятой, как разделитель строк.
octave:3> A = [1, 1, 2; 3, 5, 8; 13, 21, 34] A = 1 1 2 3 5 8 13 21 34
Операторы
[править]Вы можете использовать стандартные операторы, чтобы:
- складывать (
+
) - вычитать (
-
) - перемножать (
*
)
матрицы, векторы и скалярные величины друг с другом. Обратите внимание, для того, чтобы работали эти операторы, матрицы должны иметь одинаковые размеры (или быть согласованными, в случае умножения).
- Оператором транспонирования является оператор
одинарная кавычка (')
. Продолжим пример из предыдущей секции:
octave:4> A' ans = 1 3 13 1 5 21 2 8 34
Заметка На самом деле оператор
'
- это составной оператор транспонирования и нахождения комплексно-сопряженных значений для элементов матрицы. Для матрицы вещественных значений это не имеет значения, но для матриц с комплексными значениями такое поведение не всегда желательно. Для того, чтобы просто транспонировать матрицу с комплексными значениями, без замены их на комплексно-сопряженные, используйте оператор"точка-транспонирование"
(.'
).
- Оператор возведения в степень (
^
) доступен и может использоваться только для возведения квадратных матриц в вещественные степени
Поэлементные операции
[править]Вы также можете выполнять различные поэлементные операции, когда у вас имеются матрицы одинакового размера. Например, следующий код разделит все значения в матрице А на соответствующие им значения из матрицы В:
octave:1> A = [1, 6, 3; 2, 7, 4] A = 1 6 3 2 7 4 octave:2> B = [2, 7, 2; 7, 3, 9] B = 2 7 2 7 3 9 octave:3> A ./ B ans = 0.50000 0.85714 1.50000 0.28571 2.33333 0.44444
Обратите внимание, что оператор деления используется через точку (./
). Аналогичным образом можно выполнять поэлементное умножение (.*
) и возведение в степень (.^
).
Давайте создадим скалярную переменную:
a = 5
Операцию ./
также можно использовать и со скалярами следующим образом:
C = a ./ B
В результате получим матрицу С, значения в которой будут определяться как:
т.е. как результат деления переменной a на каждое из значений B.
C = a .^ B
в качестве результата вернет
Индексация
[править]Вы можете работать с частями матриц или векторов с помощью индексации. Для индексации используется вектор целых чисел, который сообщает Octave, с какими элементами вектора или матрицы мы хотим работать. Например, создадим следующий вектор:
octave:1> x = [1.2, 5, 7.6, 3, 8] x = 1.2000 5.0000 7.6000 3.0000 8.0000
Теперь, чтобы увидеть второй элемент x
, введите:
octave:2> x(2) ans = 5
Вы также можете посмотреть сразу несколько элементов:
octave:3> x([1, 3, 4]) ans = 1.2000 7.6000 3.0000
эта команда показывает 1-й,3-й и 4-й элементы вектора x
Для выбора строк и столбцов из матрицы используется тот же принцип. Давайте зададим матрицу:
octave:4> A = [1, 2, 3; 4, 5, 6; 7, 8, 9] A = 1 2 3 4 5 6 7 8 9
и выделим 1-ю и 3-ю строки и 2-й и 3-й столбцы:
octave:5> A([1, 3], [2, 3]) ans = 2 3 8 9
Оператор двоеточие (:
) можно использовать для выбора всех значений строки или матрицы. Так, для получения значений во второй строке, введите:
octave:6> A(2, :) ans = 4 5 6
Вы также можете использовать :
для получения всех значений из матрицы:
octave:7> A(:,:) ans = 1 2 3 4 5 6 7 8 9
Диапазоны значений
[править]Извлекаемые строки и столбцы из матрицы можно также задавать в виде диапазона значений:
start:step:stop
На самом деле вы можете ввести диапазон в командной строке Octave и посмотреть что получится:
octave:3> 1:3:10 ans = 1 4 7 10
Первое отображенное число - это start, второе - это start + step, треть - start + (2*step) и т.д. Последнее число должно быть меньшим либо равным stop.
Часто случается, что шаг должен быть равным единице. В там случае параметр step можно опустить:
octave:4> 1:10 ans = 1 2 3 4 5 6 7 8 9 10
Как вы могли заметить, результатом является обычный вектор целых чисел. Теперь вы можете использовать этот подход для индексации в векторе или матрице. Чтобы получить подматрицу начиная с верхнего левого угла, введите:
octave:4> A(1:2, 1:2) ans = 1 2 4 5
И, наконец, можно использовать ключевое слово end
для индексации по массиву или матрице. Оно всегда ссылается на последний элемент в строке или столбце. Например, чтобы получить последний столбце в матрице, введите:
octave:5> A(:,end) ans = 3 6 9
Полезные функции
[править]Следующие функции могут быть использованы для быстрого создания матриц и выполнения с ними различных манипуляций
Создание матриц
[править]tril(A)
возвращает нижний треугольник от матрицы A.
triu(A)
возвращает верхний треугольник от матрицы A.
eye(n)
возвращает единичную матрицу размера . Вы также можете ввестиeye(m, n)
для создания прямоугольной единичной матрицы.
ones(m, n)
возвращает матрицу размера заполненную единицами. Аналоично,ones(n)
вернет квадратную матрицу размера .
zeros(m, n)
возвращает матрицу размера заполненную нулями. Аналогично,zeros(n)
вернет квадратную матрицу размера .
rand(m, n)
вернет матрицу размера заполненную равномерное распределенными случайными значениями из диапазона . Конечно же,rand(n)
вернет квадратную матрицу .
randn(m, n)
вернет матрицу размера заполненную случайными значениями, распределенными по нормальному закону
randperm(n)
вернет вектор-строку, заполненную случайной перестановкой .
diag(x)
илиdiag(A)
. Для вектора x функция вернет квадратную матрицу с элементами из x на главной диагонали и нулями в остальных элементах. Для матрицы A функция вернет вектор, содержащий в себе элементы, лежащие на главной диагонали A. Например:
octave:16> A = [1, 2, 3; 4, 5, 6; 7, 8, 9] A = 1 2 3 4 5 6 7 8 9 octave:17> x = diag(A) ans = 1 5 9 octave:18> diag(x) ans = 1 0 0 0 5 0 0 0 9
linspace(a, b, n)
вернет вектор размера n, в котором первый элемент равен a, а последний равен b, а разница между последовательными элементами одинакова и равна (b - a)/n. Последний аргумент n опциональный, по умолчанию равный 100.
octave:186> linspace(2, 4, 2) ans = 2 4 octave:187> linspace(2, 4, 4) ans = 2.0000 2.6667 3.3333 4.0000 octave:188> linspace(2, 4, 6) ans = 2.0000 2.4000 2.8000 3.2000 3.6000 4.0000
logspace(a, b, n)
вернет вектор размера n, в котором первый элемент равен , последний - , в отношение двух соседних значений постоянно. Последний аргумент n опциональный, по умолчанию равный 50.
octave:189> logspace(2, 4, 2) ans = 100 10000 octave:190> logspace(2, 4, 4) ans = 1.0000e+02 4.6416e+02 2.1544e+03 1.0000e+04 octave:191> logspace(2, 4, 5) ans = 1.0000e+02 3.1623e+02 1.0000e+03 3.1623e+03 1.0000e+04
Особые матрицы
[править]Существует еще несколько функций для создания специальных матриц:
hankel
(Ганкелева матрица),hilb
(Матрица Гильберта),invhilb
(Inverse of a Hilbert matrix),sylvester_matrix
(Матрица Сильвестра) - В v3.8.1 вы увидите предупреждение:
sylvester_matrix is obsolete and will be removed from a future version of Octave; please use hadamard(2^k) instead
(матрица сильвестра устарела и будет удалена в будущих версихя Octave; пожалуйста, пользуйтесь hadamard(2^k))
toeplitz
(Матрица Тёплица),vander
(Определитель Вандермонда).
Используйте help имя функции
чтобы узнать больше информации об этих функциях.
Изменение матриц
[править]fliplr(A)
вернет копию матрицы A с обратным порядком столбцов, например:
octave:49> A = [1, 2, 3, 4; 5, 6, 7, 8; 9, 10, 11, 12] A = 1 2 3 4 5 6 7 8 9 10 11 12 octave:50> fliplr(A) ans = 4 3 2 1 8 7 6 5 12 11 10 9
flipud(A)
вернет копию матрицы A с обратным порядком строк, например:
octave:51> flipud(A) ans = 9 10 11 12 5 6 7 8 1 2 3 4
rot90(A, n)
вернет копию матрицы A повернутую на (90n)° по часовой стрелке. Второй аргумент, , не является обязательным и по умолчанию равен 1. Может быть отрицательным.
octave:52> rot90(A) ans = 4 8 12 3 7 11 2 6 10 1 5 9
reshape(A, m, n)
- функция создает матрицу размера с элементами взятыми из A. Число элементов в матрице A обязано быть равным . Значения берутся из A в порядке изъятия столбцов, что означает, что значения из первого столбца () читаются первыми, затем извлекаются значения из второго столбца () и т.д.
octave:53> reshape(A, 2, 6) ans = 1 9 6 3 11 8 5 2 10 7 4 12
sort(x)
возвращает отсортированную по возрастанию копию вектора x.
octave:54> x = rand(1, 6) x = 0.25500 0.33525 0.26586 0.92658 0.68799 0.69682 octave:55> sort(x) ans = 0.25500 0.26586 0.33525 0.68799 0.69682 0.92658
Линейная алгебра
[править]Для изучения еще некоторых операторов и функций, которые можно использовать для манипуляции с векторами и матрицами, поиска собственных чисел и т.д. см. раздел Линейная алгебра.
Вернуться в список уроков