Создание, конкатенация и расширение матрицы
Самая основная структура данных 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)
Как построить вектор-столбец и вектор-строку с определенным шагом

Определить минимальный вектор-строку и максимальный вектор-столбец
Определить минимальный вектор-строку и максимальный вектор- столбец (минимальным вектором из.
Создать вектор фиксированного размера с определенным шагом
Всем привет! Скажите пожалуйста, как создать вектор фиксированного размера с определенным шагом.
как построить вектор столбец?
подскажите пожалуйста ,как вывести столбец двухмерного массива (номер столбца вводится с.
Умножить одномерный массив (вектор-строка) на главную диагональ (вектор столбец)
Помогите исправить ошибки в коде, пожалуйста. Задание: задать матрицу 3х3 с помощью указателей.
Документация
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
Произведение элементов массива
Изменение размерности массива
Сдвиг размерностей массива
Удалите одноэлементные размерности
Преобразуйте индексы в линейные индексы
Сумма элементов массива
Похожие темы
- Индексация массива
- Методы, чтобы улучшить производительность
- Массив по сравнению Матричные операции