Документация
Эта тема содержит введение в создание матриц и выполнение основных матричных вычислений в MATLAB ® .
Среда MATLAB использует термин матрица , чтобы указать на переменное, содержащее вещественные или комплексные числа, расположенные в двумерной сетке. Массив является, в более общем плане, вектором, матрицей или более высокой размерной сеткой чисел. Все массивы в MATLAB являются прямоугольными, в том смысле, что векторы компонента по любому измерению являются всеми одинаковыми длина. Математические операции, заданные на матрицах, являются предметом линейной алгебры.
Создание матриц
MATLAB имеет много функций, которые создают различные виды матриц. Например, можно создать симметрическую матрицу с записями на основе треугольника Паскаля:
A = pascal(3)
A = 1 1 1 1 2 3 1 3 6
Или, можно создать несимметричную матрицу магического квадрата , которая имеет равные суммы строки и столбца:
B = magic(3)
B = 8 1 6 3 5 7 4 9 2
Другим примером является 3 2 прямоугольная матрица случайных целых чисел. В этом случае первый вход к randi описывает область значений возможных значений для целых чисел, и вторые два входных параметров описывают количество строк и столбцов.
C = randi(10,3,2)
C = 9 10 10 7 2 1
Вектор-столбцом является m-by-1 матрица, вектор-строка является 1 n матрицей, и скаляр является матрицей 1 на 1. Чтобы задать матрицу вручную, используйте квадратные скобки [ ] обозначить начало и конец массива. В скобках используйте точку с запятой ; обозначить конец строки. В случае скаляра (матрица 1 на 1), не требуются скобки. Например, эти операторы производят вектор-столбец, вектор-строку и скаляр:
u = [3; 1; 4] v = [2 0 -1] s = 7
u = 3 1 4 v = 2 0 -1 s = 7
Для получения дополнительной информации о создании и работе с матрицами, смотрите Создание, конкатенацию и расширение матрицы.
Сложение и вычитание матриц
Сложение и вычитание матриц и массивов выполняются поэлементно или поэлементные . Например, добавление A к B и затем вычитание A от результата восстанавливает B :
X = A + B
X = 9 2 7 4 7 10 5 12 8
Y = X - A
Y = 8 1 6 3 5 7 4 9 2
Сложение и вычитание требуют, чтобы обе матрицы имели совместимые размерности. Если размерности несовместимы, ошибка заканчивается:
X = A + C
Error using + Matrix dimensions must agree.
Для получения дополнительной информации см. Массив по сравнению Матричные операции.
Векторные произведения и транспонирование
Вектор-строка и вектор-столбец той же длины могут быть умножены в любом порядке. Результатом является или скаляр, названный скалярным произведением , или матрица, названная векторным произведением :
u = [3; 1; 4]; v = [2 0 -1]; x = v*u
x = 2
X = u*v
X = 6 0 -3 2 0 -1 8 0 -4
Для действительных матриц транспонировать операция обменивается a i j и a j i. Для комплексных матриц другой фактор состоит в том, взять ли сопряженное комплексное число комплексных записей в массиве, чтобы сформировать комплексное сопряженное транспонирование . MATLAB использует оператор апострофа ( ‘ ) выполнять комплексное сопряженное транспонирование и оператор точечного апострофа ( .’ ) транспонировать без спряжения. Для матриц, содержащих все действительные элементы, эти два оператора возвращают тот же результат.
Матрица в качестве примера A = pascal(3) симметрично , таким образом , A’ равно A . Однако B = magic(3) не симметрично, таким образом , B’ отразили элементы по основной диагонали:
B = magic(3)
B = 8 1 6 3 5 7 4 9 2
X = B'
X = 8 3 4 1 5 9 6 7 2
Для векторов перемещение превращает вектор-строку в вектор-столбец (и наоборот):
x = v' x = 2 0 -1
Если x и y оба действительные вектор-столбцы, затем продукт x*y не задан, но эти два продукта
приведите к тому же скалярному результату. Это количество используется так часто, оно имеет три различных имени: скалярное произведение , скалярное произведение или скалярное произведение . Существует даже специализированная функция для названных скалярных произведений dot .
Для комплексного вектора или матрицы, z , количество z’ не только транспонирует вектор или матрицу, но также и преобразует каждый комплексный элемент в его сопряженное комплексное число. Таким образом, знак мнимой части каждого комплексного элемента изменения. Например, рассмотрите комплексную матрицу
z = [1+2i 7-3i 3+4i; 6-2i 9i 4+7i]
z = 1.0000 + 2.0000i 7.0000 - 3.0000i 3.0000 + 4.0000i 6.0000 - 2.0000i 0.0000 + 9.0000i 4.0000 + 7.0000i
Комплексное сопряженное транспонирование z :
ans = 1.0000 - 2.0000i 6.0000 + 2.0000i 7.0000 + 3.0000i 0.0000 - 9.0000i 3.0000 - 4.0000i 4.0000 - 7.0000i
Неспрягаемый комплекс транспонирует, где комплексная часть каждого элемента сохраняет свой знак, обозначается z.’ :
ans = 1.0000 + 2.0000i 6.0000 - 2.0000i 7.0000 - 3.0000i 0.0000 + 9.0000i 3.0000 + 4.0000i 4.0000 + 7.0000i
Для комплексных векторов, эти два скалярных произведения x’*y и y’*x сопряженные комплексные числа друг друга и скалярное произведение x’*x из комплексного вектора с собой действительно.
Умножение матриц
Умножение матриц задано способом, который отражает состав базовых линейных преобразований и позволяет компактное представление систем одновременных линейных уравнений. Матричное произведение C = AB задан, когда размерность столбца A равна размерности строки B, или когда один из них является скаляром. Если A является m-by-p, и B является p-by-n, их продукт, C является m-by-n. Продукт может на самом деле быть задан с помощью MATLAB for циклы, colon обозначение и векторные скалярные произведения:
A = pascal(3); B = magic(3); m = 3; n = 3; for i = 1:m for j = 1:n C(i,j) = A(i,:)*B(:,j); end end
MATLAB использует звездочку, чтобы обозначить умножение матриц, как в C = A*B . Умножение матриц не является коммутативным; то есть, A*B обычно не равно B*A :
X = A*B
X = 15 15 15 26 38 26 41 70 39
Y = B*A
Y = 15 28 47 15 34 60 15 28 43
Матрица A может быть умножена справа вектор-столбцом и слева вектором-строкой:
u = [3; 1; 4]; x = A*u
x = 8 17 30
v = [2 0 -1]; y = v*B
y = 12 -7 10
Прямоугольные умножения матриц должны удовлетворить условиям совместимости размерности. Начиная с A имеет размер 3х3 и C 3 2, можно умножить их, чтобы добраться 3 2 результат (общие внутренние отмены размерности):
X = A*C
X = 24 17 47 42 79 77
Однако умножение не работает в обратном порядке:
Y = C*A
Error using * Incorrect dimensions for matrix multiplication. Check that the number of columns in the first matrix matches the number of rows in the second matrix. To perform elementwise multiplication, use '.*'.
Можно умножить что-либо со скаляром:
s = 10; w = s*y
w = 120 -70 100
Когда вы умножаете массив на скаляр, скаляр неявно расширяется, чтобы быть одного размера с другим входом. Это часто упоминается как скалярное расширение .
Единичная матрица
Общепринятое математическое обозначение использует прописную букву I, чтобы обозначить единичные матрицы, матрицы различных размеров с единицами на основной диагонали и нулях в другом месте. Эти матрицы имеют свойство, что A I = A и I A = A каждый раз, когда размерности совместимы.
Исходная версия MATLAB не могла использовать I с этой целью, потому что это не различало прописные и строчные буквы, и i уже служил индексом и как комплексной единицей. Таким образом, английская игра слов языка была введена. Функция
eye(m,n)
возвращает m-by-n прямоугольная единичная матрица и eye(n) возвращает n-by-n квадратная единичная матрица.
Обращение матриц
Если матричный A является квадратным и несингулярным (ненулевой определитель), затем уравнения A X = I и X A =, I имеет то же решение X. Это решение называется инверсией A и обозначается A -1 . inv функционируйте и выражение A^-1 оба вычисляют обратную матрицу.
A = pascal(3)
A = 1 1 1 1 2 3 1 3 6
X = inv(A)
X = 3.0000 -3.0000 1.0000 -3.0000 5.0000 -2.0000 1.0000 -2.0000 1.0000
ans = 1.0000 0 0 0.0000 1.0000 -0.0000 -0.0000 0.0000 1.0000
Определитель , вычисленный det мера масштабного коэффициента линейного преобразования, описанного матрицей. Когда определитель ниже нуля, матрица сингулярна , и никакая инверсия не существует.
d = det(A)
d = 1
Некоторые матрицы почти сингулярны , и несмотря на то, что обратная матрица существует, вычисление восприимчиво к числовым ошибкам. cond функция вычисляет число обусловленности для инверсии , которая дает индикацию относительно точности результатов матричной инверсии. Число обусловленности лежит в диапазоне от 1 для численно устойчивой матрицы к Inf для сингулярной матрицы.
c = cond(A)
c = 61.9839
Редко необходимо сформировать явную инверсию матрицы. Частое неправильное употребление inv возникает при решении системы линейных уравнений A x = b . Лучший способ решить это уравнение, с точки зрения и времени выполнения и числовой точности, состоит в том, чтобы использовать матричный оператор обратной косой черты x = A\b . Смотрите mldivide для получения дополнительной информации.
Продукт тензора Кронекера
Кронекеров продукт, kron(X,Y) , из двух матриц большая матрица, сформированная из всех возможных продуктов элементов X с теми из Y . Если X m-by-n и Y p-by-q, затем kron(X,Y) mp-by-nq. Элементы располагаются таким образом что каждый элемент X умножается на целый матричный Y :
[X(1,1)*Y X(1,2)*Y . . . X(1,n)*Y . . . X(m,1)*Y X(m,2)*Y . . . X(m,n)*Y]
Кронекеров продукт часто используется с матрицами нулей и единиц, чтобы создать повторенные копии маленьких матриц. Например, если X матрица 2 на 2
X = [1 2 3 4]
и I = eye(2,2) единичная матрица 2 на 2, затем:
kron(X,I)
ans = 1 0 2 0 0 1 0 2 3 0 4 0 0 3 0 4
kron(I,X)
ans = 1 2 0 0 3 4 0 0 0 0 1 2 0 0 3 4
Кроме kron , некоторые другие функции, которые полезны, чтобы реплицировать массивы, repmat , repelem , и blkdiag .
Векторные и матричные нормы
‖ x ‖ p = ( ∑ | x i | p ) 1 p ,
вычисляется norm(x,p) . Эта операция задана для любого значения p> 1, но наиболее распространенные значения p равняются 1, 2, и ∞. Значением по умолчанию является p = 2, который соответствует Евклидовой длине или векторной величине :
v = [2 0 -1]; [norm(v,1) norm(v) norm(v,inf)]
ans = 3.0000 2.2361 2.0000
‖ A ‖ p = max x ‖ A x ‖ p ‖ x ‖ p ,
может быть вычислен для p = 1, 2, и ∞ norm(A,p) . Снова, значением по умолчанию является p = 2:
A = pascal(3); [norm(A,1) norm(A) norm(A,inf)]
ans = 10.0000 7.8730 10.0000
В случаях, где вы хотите вычислить норму каждой строки или столбца матрицы, можно использовать vecnorm :
vecnorm(A)
ans = 1.7321 3.7417 6.7823
Используя многопоточное вычисление с функциями линейной алгебры
MATLAB поддерживает многопоточный расчет во многой линейной алгебре и поэлементных числовых функциях. Эти функции автоматически выполняются на нескольких потоках. Для функции или выражения, чтобы выполниться быстрее на нескольких центральных процессорах, много условий должны быть верными:
- Функция выполняет операции, что легко раздел в разделы, которые выполняются одновременно. Эти разделы должны смочь выполниться с небольшой связью между процессами. Они должны потребовать немногих последовательных операций.
- Размер данных является достаточно большим так, чтобы любые преимущества параллельного выполнения перевесили время, требуемое разделить данные и управлять отдельными потоками выполнения. Например, большинство функций убыстряется только, когда массив содержит несколько тысяч элементов или больше.
- Операция не ограничена памятью; время вычислений не во власти времени доступа к памяти. Как правило сложные функции ускоряют больше, чем простые функции.
Матрица умножает (X*Y) и матричная степень (X^p) операторы показывают значительное увеличение скорости на больших массивах с двойной точностью (порядка 10 000 элементов). Функции анализа матрицы det , rcond , hess , и expm также покажите значительное увеличение скорости на больших массивах с двойной точностью.
Похожие темы
- Системы линейных уравнений
- Факторизации
- Собственные значения
- Сингулярные значения
Документация MATLAB
Поддержка
- MATLAB Answers
- Помощь в установке
- Отчеты об ошибках
- Требования к продукту
- Загрузка программного обеспечения
© 1994-2021 The MathWorks, Inc.
- Условия использования
- Патенты
- Торговые марки
- Список благодарностей
Для просмотра документации необходимо авторизоваться на сайте
Войти
Памятка переводчика
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста — например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.
Создание, конкатенация и расширение матрицы
Самая основная структура данных MATLAB® является матрицей. Матрица A является двумерным, прямоугольным массивом элементов данных, расположенных в строках и столбцах. Элементами могут быть числа, логические значения ( true или false ), даты и времена, строки или некоторый другой тип данных MATLAB.
Даже один номер хранится как матрица. Например, переменная, содержащая значение 100, хранится как матрица 1 на 1 типа double .
A = 100; whos A
Name Size Bytes Class Attributes A 1x1 8 double
Построение матрицы данных
Если у вас есть определенный набор данных, можно расположить элементы в матрице с помощью квадратных скобок. Одна строка данных имеет пробелы или запятые между элементами, а точка с запятой разделяет строки. Например, создайте одну строку четырех числовых элементов. Размер получившейся матрицы 1 на 4, поскольку она имеет 1 строку и 4 столбца. Матрица A этой формы часто упоминается как вектор-строка.
A = [12 62 93 -8]
A = 1×4 12 62 93 -8
sz = size(A)
sz = 1×2 1 4
Теперь создайте матрицу с теми же числами, но расположите их в двух строках. Эта матрица имеет две строки и два столбца.
A = [12 62; 93 -8]
A = 2×2 12 62 93 -8
sz = size(A)
sz = 1×2 2 2
Специализированные матричные функции
MATLAB имеет много функций, которые помогают создавать матрицы с определенными значениями или конкретной структурой. Например, zeros и ones функции создают матрицы всех нулей или всех единиц. Первые и вторые аргументы этих функций являются количеством строк и количеством столбцов матрицы, соответственно.
A = zeros(3,2)
A = 3×2 0 0 0 0 0 0
B = ones(2,4)
B = 2×4 1 1 1 1 1 1 1 1
diag функционируйте помещает входные элементы в диагональ матрицы. Например, создайте вектор-строку A содержащий четыре элемента. Затем создайте матрицу 4 на 4, диагональными элементами которой являются элементы A .
A = [12 62 93 -8]; B = diag(A)
B = 4×4 12 0 0 0 0 62 0 0 0 0 93 0 0 0 0 -8
Конкатенация матриц
Можно также использовать квадратные скобки, чтобы соединить существующие матрицы вместе. Этот способ создать матрицу называется конкатенацией . Например, конкатенируйте два вектора-строки, чтобы сделать еще более длинный вектор-строку.
A = ones(1,4); B = zeros(1,4); C = [A B]
C = 1×8 1 1 1 1 0 0 0 0
Располагать A и B как две строки матрицы, используйте точку с запятой.
D = [A;B]
D = 2×4 1 1 1 1 0 0 0 0
Чтобы конкатенировать две матрицы, у них должны быть совместимые размеры. Другими словами, когда вы конкатенируете матрицы горизонтально, у них должно быть одинаковое число строк. Когда вы конкатенируете их вертикально, у них должно быть одинаковое число столбцов. Например, горизонтально конкатенируйте две матрицы, что у обоих есть две строки.
A = ones(2,3)
A = 2×3 1 1 1 1 1 1
B = zeros(2,2)
B = 2×2 0 0 0 0
C = [A B]
C = 2×5 1 1 1 0 0 1 1 1 0 0
Альтернативный способ конкатенировать матрицы состоит в том, чтобы использовать функции конкатенации, такие как horzcat , который горизонтально конкатенирует две совместимых входных матрицы.
D = horzcat(A,B)
D = 2×5 1 1 1 0 0 1 1 1 0 0
Генерация числовой последовательности
colon удобный путь состоит в том, чтобы создать матрицы, элементы которых последовательны и равномерно расположены с интервалами. Например, создайте вектор-строку, элементами которого являются целые числа от 1 до 10.
A = 1:10
A = 1×10 1 2 3 4 5 6 7 8 9 10
Можно использовать оператор двоеточия, чтобы создать последовательность чисел в любой области значений, с единичным шагом.
A = -2.5:2.5
A = 1×6 -2.5000 -1.5000 -0.5000 0.5000 1.5000 2.5000
Чтобы изменить значение шага последовательности, задайте шаг между начальным и конечным значением области значений, разделенных двоеточиями.
A = 0:2:10
A = 1×6 0 2 4 6 8 10
Чтобы постепенно уменьшиться, используйте отрицательное число.
A = 6:-1:0
A = 1×7 6 5 4 3 2 1 0
Можно также постепенно увеличиться значениями нецелого числа. Если инкрементное значение равномерно не делит заданную область, MATLAB автоматически заканчивает последовательность в последнем значении, которого это может достигнуть прежде, чем превысить область значений.
A = 1:0.2:2.1
A = 1×6 1.0000 1.2000 1.4000 1.6000 1.8000 2.0000
Расширение матрицы
Можно добавить один или несколько элементов в матрицу путем размещения их за пределами существующих контуров индекса строки и столбца. MATLAB автоматически заполняет матрицу нулями, чтобы сохранить его прямоугольным. Например, создайте матрицу 2 на 3 и добавьте дополнительную строку и столбец в него путем вставки элемента в (3,4) положение.
A = [10 20 30; 60 70 80]
A = 2×3 10 20 30 60 70 80
A(3,4) = 1
A = 3×4 10 20 30 0 60 70 80 0 0 0 0 1
Можно также расширить размер путем вставки новой матрицы за пределами существующих областей значений индекса.
A(4:5,5:6) = [2 3; 4 5]
A = 5×6 10 20 30 0 0 0 60 70 80 0 0 0 0 0 0 1 0 0 0 0 0 0 2 3 0 0 0 0 4 5
Расширять размер матрицы неоднократно, такой как в for цикл, обычно лучше предварительно выделить место для самой большой матрицы, которую вы ожидаете создавать. Без предварительного выделения MATLAB должен выделить память каждый раз увеличения размера, замедлив операции. Например, предварительно выделите матрицу, которая содержит до 10 000 строк и 10 000 столбцов путем инициализации ее элементов, чтобы обнулить.
A = zeros(10000,10000);
Если необходимо предварительно выделить дополнительные элементы позже, можно расширить его путем присвоения за пределами матричных областей значений индекса или конкатенировать другую предварительно выделенную матрицу к A .
Пустые массивы
Пустой массив в MATLAB является массивом по крайней мере с одной равной нулю длиной размерности. Пустые массивы полезны для представления концепции «ничего» программно. Например, предположите, что вы хотите найти все элементы вектора, которые меньше 0, но нет ни одного. find функция возвращает пустой вектор индексов, указывая, что она не могла найти элементы меньше чем 0.
A = [1 2 3 4]; ind = find(A<0)
ind = 1x0 empty double row vector
Много алгоритмов содержат вызовы функции, которые могут возвратить пустые массивы. Часто полезно позволить пустым массивам течь через эти алгоритмы как аргументы функции вместо того, чтобы обработать их как особый случай. Если действительно необходимо настроить обработку пустого массива, можно проверять на них использующий isempty функция.
TF = isempty(ind)
TF = logical 1
Похожие темы
- Индексация массива
- Изменение и реорганизация массивов
- Многомерные массивы
- Создание массивов строк
- Представление дат и времени в MATLAB
Открытый пример
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
Документация MATLAB
Поддержка
- MATLAB Answers
- Помощь в установке
- Отчеты об ошибках
- Требования к продукту
- Загрузка программного обеспечения
© 1994-2021 The MathWorks, Inc.
- Условия использования
- Патенты
- Торговые марки
- Список благодарностей
Для просмотра документации необходимо авторизоваться на сайте
Войти
Памятка переводчика
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.
Формирование векторов и матриц MatLab
Описанные выше простые правила вычислений распространяются и на гораздо более сложные вычисления, которые (при использовании обычных языков программирования типа Бейсик или Паскаль) требуют составления специальных программ. MATLAB — система, специально предназначенная для проведения сложных вычислений с векторами, матрицами и массивами. При этом она по умолчанию предполагает, что каждая заданная переменная — это вектор, матрица или массив. Все определяется конкретным значением переменной. Например, если задано Х=1, то это значит, что X —это вектор с единственным элементом, имеющим значение 1. Если надо задать вектор из трех элементов, то их значения следует перечислить в квадратных скобках, разделяя пробелами. Так, например, присваивавание
» V=[l 2 3]
V=
1 2 3
задает вектор V, имеющий три элемента со значениями 1, 2 и 3. После ввода вектора система выводит его на экран дисплея.
Задание матрицы требует указания нескольких строк. Для разграничения строк используется знак ; (точка с запятой). Этот же знак в конце ввода предотвращает вывод матрицы или вектора (и вообще результата любой операции) на экран дисплея. Так, ввод
» М=[1 2 3: 4 5 6; 7 8 9];
задает квадратную матрицу, которую можно вывести:
» M
M =
1 2 3
7 8 9
Возможен ввод элементов матриц и векторов в виде арифметических выражений, содержащих любые доступные системе функции, например:
» V= [2+2/(3+4) exp(5) sqrt(l0)]:
2.2857 148.4132 3.1623
Для указания отдельного элемента вектора или матрицы используются выражения вида V(1) или M(i. j). Например, если задать
» М(2. 2)
arts= 5
то результат будет равен 5. Если нужно присвоить элементу M(i. j) [ В тексте программ MATLAB лучше не использовать i и j как индексы, так как i и j — обозначение квадратного корня из -1. Но можно использовать I и J. — Примеч. ред. ] новое значение х, следует использовать выражение
M(ij)=x
Например, если элементу М(2, 2) надо присвоить значение 10, следует записать
» М(2. 2)=10
Выражение М( i) с одним индексом дает доступ к элементам матрицы, развернутым в один столбец. Такая матрица образуется из исходной, если подряд выписать ее столбцы.
Следующий пример поясняет такой доступ к элементам матрицы М:
» М=[1 2 3: 4 5 6: 7 8 9]
М =
1 2 3
4 5 6
7 8 9
М =
1 2 3
4 100 6
7 8 9
Возможно задание векторов и матриц с комплексными элементами, например:
» i=sqrt(-l):
» СМ =[1 2: 3 4] + i*[5 6: 7 8]
или
» СМ - [1+5*1 2+6*1: 3+7*1 4+8*1]
Это создает матрицу:
CM=
1.0000 + 5.00001 2.0000 + 6.00001
3.0000 + 7.00001 4.0000 + 8.00001
Наряду с операциями над отдельными элементами матриц и векторов система позволяет производить операции умножения, деления и возведения в степень сразу над всеми элементами, т. е. над массивами. Для этого перед знаком операции ставится точка. Например, оператор * означает умножение для векторов или матриц, а оператор .* —поэлементное умножение всех элементов массива. Так, если М — матрица, то М.*2 даст матрицу, все элементы которой умножены на скаляр — число 2. Впрочем, для умножения матрицы,на скаляр оба выражения — М*2 и М.*2 — оказываются эквивалентными.
Имеется также ряд особых функций для задания векторов и матриц. Например, функция magic(n) задает магическую матрицу размера пхп, у которой сумма всех столбцов, всех строк и даже диагоналей равна одному и тому же числу:
» M=magic(4)
Документация
MATLAB ® оптимизирован для операций включающие матрицы и векторы. Процесс пересмотра основанного на цикле, ориентированного на скаляр кода, чтобы использовать матрицу MATLAB и векторные операции называется векторизацией . Векторизация вашего кода стоит по нескольким причинам:
- Внешний вид: Векторизованный математический код появляется больше как математические выражения, найденные в учебниках, делая код легче понять.
- Менее подверженный ошибкам : Без циклов векторизованный код часто короче. Меньше линий кода означает меньше возможностей ввести программные ошибки.
- Производительность: Векторизованный код часто запускается намного быстрее, чем соответствующий код, содержащий циклы.
Векторизация кода для общего вычисления
Этот код вычисляет синус 1 001 значения в пределах от от 0 до 10:
i = 0; for t = 0:.01:10 i = i + 1; y(i) = sin(t); end
Это - векторизованная версия того же кода:
t = 0:.01:10; y = sin(t);
Второй пример кода обычно выполняется быстрее, чем первое и является более эффективным использованием MATLAB. Скорость выполнения теста в вашей системе путем создания скриптов, которые содержат код, показанный, и затем используют tic и toc функции, чтобы измерить их время выполнения.
Векторизация кода для определенных задач
Этот код вычисляет совокупную сумму вектора в каждом пятом элементе:
x = 1:10000; ylength = (length(x) - mod(length(x),5))/5; y(1:ylength) = 0; for n= 5:5:length(x) y(n/5) = sum(x(1:n)); end
Используя векторизацию, можно записать намного более краткий процесс MATLAB. Этот код показывает один способ выполнить задачу:
x = 1:10000; xsums = cumsum(x); y = xsums(5:5:length(x));
Операции над массивами
Операторы массивов выполняют ту же операцию для всех элементов в наборе данных. Эти типы операций полезны для повторяющихся вычислений. Например, предположите, что вы собираете объем ( V ) из различных конусов путем записи их диаметра ( D ) и высота ( H ). Если вы собираете информацию всего для одного конуса, можно вычислить объем для того одного конуса:
V = 1/12*pi*(D^2)*H;
Теперь соберите информацию относительно 10 000 конусов. Векторы D и H каждый содержит 10 000 элементов, и вы хотите вычислить 10 000 объемов. На большинстве языков программирования необходимо настроить цикл, похожий на этот код MATLAB:
for n = 1:10000 V(n) = 1/12*pi*(D(n)^2)*H(n); end
С MATLAB можно выполнить вычисление для каждого элемента вектора с подобным синтаксисом как скалярный случай:
% Vectorized Calculation V = 1/12*pi*(D.^2).*H;
Примечание
Размещение периода ( . ) перед операторами * , / , и ^ , преобразовывает их в операторы массивов.
Операторы массивов также позволяют вам объединить матрицы различных размерностей. Это автоматическое расширение размера 1 размерность полезно для векторизации создания сетки, матричных и векторных операций и т.д.
Предположим тот матричный A представляет экзаменационные отметки, строки которых обозначают различные классы. Вы хотите вычислить разность между средней оценкой и отдельной музыкой к каждому классу. Используя цикл, операция похожа:
A = [97 89 84; 95 82 92; 64 80 99;76 77 67;. 88 59 74; 78 66 87; 55 93 85]; mA = mean(A); B = zeros(size(A)); for n = 1:size(A,2) B(:,n) = A(:,n) - mA(n); end
Более прямой способ сделать это с A - mean(A) , который избегает потребности цикла и значительно быстрее.
devA = A - mean(A)
devA = 18 11 0 16 4 8 -15 2 15 -3 -1 -17 9 -19 -10 -1 -12 3 -24 15 1
Даже при том, что A 7 3 матрица и mean(A) 1 3 вектор, MATLAB неявно расширяет вектор, как будто это имело тот же размер как матрица, и операция выполняется как нормальное поэлементное минус операция.
Требование размера для операндов - то, что для каждой размерности, массивы должны или иметь тот же размер или одного из них, 1. Если это требование удовлетворяется, то размерности, где один из массивов имеет размер 1, расширены, чтобы быть одного размера с соответствующей размерностью в другом массиве. Для получения дополнительной информации см. "Совместимые размеры массивов для основных операций".
Другая область, где неявное расширение полезно для векторизации, - то, если вы работаете с многомерными данными. Предположим, что вы хотите выполнить функцию, F , из двух переменных, x и y .
F (x, y) = x*exp (-x 2 Y 2 )
Выполнять эту функцию в каждой комбинации точек в x и y векторы, необходимо задать сетку значений. Для этой задачи необходимо избегать использования циклов, чтобы выполнить итерации через комбинации точки. Вместо этого если один из векторов является столбцом, и другой строка, то MATLAB автоматически создает сетку, когда векторы используются с оператором массивов, таким как x+y или x-y . В этом примере, x 21 1 вектор и y 1 16 вектор, таким образом, операция производит 21 16 матрица путем расширения второго измерения x и первая размерность y .
x = (-2:0.2:2)'; % 21-by-1 y = -1.5:0.2:1.5; % 1-by-16 F = x.*exp(-x.^2-y.^2); % 21-by-16
В случаях, где вы хотите явным образом создать сетки, можно использовать meshgrid и ndgrid функции.
Операции логического массива
Логическое расширение объемной обработки массивов должно векторизовать сравнения и принятие решения. Операторы сравнения MATLAB принимают векторные входные параметры и возвращают векторные выходные параметры.
Например, предположите при сборе данных от 10 000 конусов, вы записываете несколько отрицательных величин для диаметра. Можно определить, какие значения в векторе допустимы с >= оператор:
D = [-0.2 1.0 1.5 3.0 -1.0 4.2 3.14]; D >= 0
ans = 0 1 1 1 0 1 1
Можно непосредственно использовать логическую степень индексации MATLAB выбрать допустимые конические объемы, Vgood , для которого соответствующие элементы D являются неотрицательными:
Vgood = V(D >= 0);
MATLAB позволяет вам выполнять логический AND или OR на элементах целого вектора с функциями all и any , соответственно. Можно выдать предупреждение если все значения D ниже нуля:
if all(D < 0) warning('All values of diameter are negative.') return end
MATLAB может также сравнить два вектора с совместимыми размерами, позволив вам ввести дальнейшие ограничения. Этот код находит все значения, где V является неотрицательным и D больше H :
V((V >= 0) & (D > H))
Итоговый вектор одного размера с входными параметрами.
Чтобы помочь сравнению, MATLAB содержит специальные значения, чтобы обозначить переполнение, потерю значимости и неопределенные операторы, такой как Inf и NaN Логические операторы isinf и isnan существуйте, чтобы помочь выполнить логические тесты для этих специальных значений. Например, часто полезно исключить NaN значения от расчетов:
x = [2 -1 0 3 NaN 2 NaN 11 4 Inf]; xvalid = x(~isnan(x))
xvalid = 2 -1 0 3 2 11 4 Inf
Примечание
Inf == Inf возвращает true; однако, NaN == NaN всегда возвращает false.
Матричные операции
При векторизации кода часто необходимо создавать матрицу с конкретным размером или структурой. Методы существуют для создания универсальных матриц. Например, вам может быть нужна матрица 5 на 5 равных элементов:
A = ones(5,5)*10;
Или, вам может быть нужна матрица повторяющихся значений:
v = 1:5; A = repmat(v,3,1)
A = 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
Функция repmat обладает гибкостью в создании матриц из меньших матриц или векторов. repmat создает матрицы путем повторения входной матрицы:
A = repmat(1:3,5,2) B = repmat([1 2; 3 4],2,2)
A = 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 B = 1 2 1 2 3 4 3 4 1 2 1 2 3 4 3 4
Упорядоченное расположение, устанавливая и считая операции
Во многих приложениях вычисления, сделанные на элементе вектора, зависят от других элементов в том же векторе. Например, вектор, x, может представлять набор. Как выполнить итерации через набор без a for или while цикл не очевиден. Процесс становится намного более ясным и синтаксис, менее громоздкий, когда вы используете векторизованный код.
Устранение избыточных элементов
Много различных путей существуют для нахождения избыточных элементов вектора. Один путь включает функцию diff . После сортировки векторных элементов равные смежные элементы производят нулевую запись, когда вы используете diff функция на том векторе. Поскольку diff(x) дает вектор, который имеет тот меньше элемента, чем x , необходимо добавить элемент, который не равен никакому другому элементу в наборе. NaN всегда удовлетворяет этому условию. Наконец, можно использовать логическую индексацию, чтобы выбрать уникальные элементы в наборе:
x = [2 1 2 2 3 1 3 2 1 3]; x = sort(x); difference = diff([x,NaN]); y = x(difference~=0)
y = 1 2 3
В качестве альтернативы вы могли выполнить ту же операцию при помощи unique функция:
y=unique(x);
Однако unique функциональная сила обеспечивает больше функциональности, чем необходимо, и замедлите подписание своего кода. Используйте tic и toc функции, если вы хотите измерить уровень каждого фрагмента кода.
Подсчет элементов в векторе
Вместо того, чтобы просто возвращать набор или подмножество, x , можно считать случаи элемента в векторе. После векторных видов можно использовать find функция, чтобы определить индексы нулевых значений в diff(x) и показать, где элементы изменяют значение. Различие между последующими индексами от find функция указывает на количество случаев для конкретного элемента:
x = [2 1 2 2 3 1 3 2 1 3]; x = sort(x); difference = diff([x,max(x)+1]); count = diff(find([1,difference])) y = x(find(difference))
count = 3 4 3 y = 1 2 3
find функция не возвращает индексы для NaN элементы. Можно считать количество NaN и Inf значения с помощью isnan и isinf функции.
count_nans = sum(isnan(x(:))); count_infs = sum(isinf(x(:)));
Функции, обычно используемые в векторизации
Определите, являются ли все элементы массива ненулевыми или верными
Определите, являются ли какие-либо элементы массива ненулевыми
Разности и аппроксимация производных
Найдите индексы и значения ненулевых элементов
Индексы от линейного индекса
Инверсия переставляет размерности массива N-D
Преобразуйте числовые значения в logicals
Прямоугольная сетка в 2D и трехмерном пространстве
Прямоугольная сетка на пробеле N-D
Перестройте размерности массива N-D
Произведение элементов массива
Изменение размерности массива
Сдвиг размерностей массива
Удалите одноэлементные размерности
Преобразуйте индексы в линейные индексы
Сумма элементов массива
Похожие темы
- Индексация массива
- Методы, чтобы улучшить производительность
- Массив по сравнению Матричные операции