Создание матриц
Матрицы представлены в Mathematica при помощи списков. Они могут быть заданы непосредственно списком { }, построены по формуле или импортированы из файла данных. Mathematica также содержит команды для создания диагональных матриц, постоянных матриц и других специальных типов матриц.
Матрица может быть введена непосредственно с помощью символов {}:
In[125]:=
Out[125]=
Вывести результат в матричном виде можно с помощью команды MatrixForm:
In[126]:=
Out[126]//MatrixForm=
expr//fun является еще одним способом ввода fun[expr]. Такая команда особенно эффективна в случае, если fun является функцией форматирования.
В этом примере, функция Table использована для создания таблицы значений для x и y:
In[127]:=
In[129]:=
Out[129]//MatrixForm=
Обратите внимание, что в Mathematica содержимое матриц не ограничивается только числами; они могут содержать символьные элементы, равно как и формулы:
In[130]:=
Out[131]//MatrixForm=
Когда Вы создаете матрицу и сохраняете ее путем задания имени, постарайтесь избегать использования функции форматирования MatrixForm. Если это все же необходимо, используйте круглые скобки:
In[132]:=
Out[132]//MatrixForm=
Сохраненную матрицу mat можно использовать в дальнейших вычислениях:
In[133]:=
Out[133]//MatrixForm=
Предположим, Вы пренебрегли данным выше предостережением и не использовали круглые скобки:
In[134]:=
Out[134]//MatrixForm=
Тогда mat будет выводится как матрица, но не будет работать в вычислениях. Например, следующее выражение не приводит к умножению матрицы на матрицу:
In[135]:=
Out[135]=
Выведем значения mat, использовав функцию FullForm:
In[11]:=
Out[11]//FullForm=
Это показывает, что mat включает в себя форматирующую оболочку MatrixForm, которая не дает ей работать в качестве матрицы.
Существуют функции для создания различных специальных матриц.
Так создается матрица 4?5 из действительных чисел в диапазоне от -10 до 10:
In[136]:=
Out[136]//MatrixForm=
Так создается матрица, которая содержит отличные от нуля элементы только на диагонали:
In[137]:=
Out[137]//MatrixForm=
Так создается матрица с одинаковыми элементами:
In[138]:=
Out[138]//MatrixForm=
Так создается матрица Гильберта 4?4, где каждый элемент списка имеет вид 1/ (i+j–1):
In[139]:=
Out[139]//MatrixForm=
Многие из функций линейной алгебры (и не только!) выдают результат в виде матрицы.
Здесь вычислено QR-разложение произвольной матрицы 3?3:
In[140]:=
Так отображается Q матрица:
In[142]:=
Out[142]//MatrixForm=
Когда функции Mathematica выводят результат в виде матриц, они зачастую используют оптимизированный формат хранения, называемый упакованным массивом.
В Mathematica Вы можете применить к списку множество стандартных операций и, в результате, получить другой список, к каждому элементу которого была применена функция. Это в равной степени относится и к матрицам, являющимися списками из подсписков.
Вот матрица 2?2, состоящая из квадратов чисел:
In[143]:=
Out[144]//MatrixForm=
Это применение функции нахождения квадратного корня Sqrt к каждому элементу матрицы:
In[145]:=
Out[145]//MatrixForm=
Эту особенность функции Sqrt называют применимостью к спискам, и она позволяет создавать легко читающийся и эффективный код.
Если используется функция, которая не обладает применимостью к спискам, она не может быть применена к каждому элементу:
In[146]:=
Out[146]=
При желании, Вы можете сделать функцию применимой к спискам (и она будет применяться к каждому элементу):
In[147]:=
Out[148]//MatrixForm=
Другим важным способом создания матриц является импорт файла данных. Это может быть сделано с табличными форматами, такими как Table (.dat), CSV (.csv) и TSV (.tsv). Матрица может быть также считана из таблицы Excel (.xls).
Здесь использована команда ImportString для импорта строк CSV формата в матрицу. Импорт из файла выполняется с помощью команды Import:
In[149]:=
Out[149]=
Mathematica также поддерживает ряд других форматов, включая научные и медицинские форматы данных, такие как HarwellBoeing, MAT, HDF, NASACDF и FITS.
Способ, выбранный для создания матрицы, может оказать существенное влияние на эффективность создаваевмых Вами программ. Для повышения эффективности, следует избегать добавления данных к матрице, не использовать ненужных операций по созданию матриц. Везде, где это возможно, лучше отдать предпочтение операциям, применимым к спискам.
Данный пример многократно добавляет новую строку в матрицу:
In[150]:=
Out[151]=
Намного быстрее создать матрицу за один цикл. Если в коде Вы видите функцию цикла For, постарайтесь заменить ее на другую конструкцию, скажем Table:
In[152]:=
Out[152]=
Следующий пример создает 2?n матрицу из нулей, а затем заполняет ее при помощи циклической операции. Создание нулевой матрицы здесь совершенно не нужно.
In[153]:=
Out[153]=
Гораздо быстрее создать данные для каждой строки за один раз, а далее пользоваться операциями, применяемыми к спискам:
In[154]:=
Out[154]=
Если матрицы большие и содержат много одинаковых элементов (например, нулевых), тогда следует рассмотреть возможность работы с разреженными матрицами, построенными с п&# 1086;мощью функции SparseArray.