Перейти к содержанию

Программирование на 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

Особые матрицы

[править]

Существует еще несколько функций для создания специальных матриц:

sylvester_matrix is obsolete and will be removed from a future version of Octave; please use hadamard(2^k) instead
(матрица сильвестра устарела и будет удалена в будущих версихя Octave; пожалуйста, пользуйтесь hadamard(2^k))

Используйте 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

Линейная алгебра

[править]

Для изучения еще некоторых операторов и функций, которые можно использовать для манипуляции с векторами и матрицами, поиска собственных чисел и т.д. см. раздел Линейная алгебра.


Вернуться в список уроков