Progress-servis55.ru

Новости из мира ПК
13 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Поэлементное умножение матриц matlab

Поэлементное умножение матриц matlab

Так как массивы явяляются самыми распространёнными и самыми ценными типами данных в системе MATLAB, то важно подробно рассмотреть все нюансы вычислений с ними. Ранее (п.2) мы рассмотрели действие арифметических, логических операций и операций сравнения в частном случае скаляров (массив размера 1×1). Теперь повторим это рассмотрение для случая массивов.

Начнём с арифметических операций. Операции сложения и вычитания осуществляются с массивами поэлементно и обозначаются теми же самыми традиционными значками. Если A = [ 1 1 1; 2 2 2; 3 3 3 ] ; B = [ 0 0 0; 7 7 7; 1 2 3 ] , то справедливо равенство

A + B == [ 1 1 1 ; 9 9 9 ; 4 5 6 ];

Складываемые (вычитаемые) матрицы должны иметь одинаковые размеры. Допускается исключение — если одно из слагаемых является скаляром. В этом случае производится генерация матрицы с таким же размером, как и у матричного слагаемого, причём все её элементы одинаковые и равны исходному скаляру. Например,

A + 5 == [ 6 6 6 ; 7 7 7 ; 8 8 8 ];

То есть до выполнения поэлементного матричного сложения из скаляра 5 получают безымянную матрицу [ 5 5 5; 5 5 5; 5 5 5 ] , которую и складывают с A .

Теперь рассмотрим умножение и деление (а также возведение в степень). Здесь традиционные значки зарезервированы за действиями линейной алгебры: знак * означает перемножение матриц (а также вектор-строк и вектор-столбцов) по широко известному правилу «строка на столбец«. Традиционный знак деления / (а также знак ) закреплён за «операцией нахождения решений систем линейных уравнений«. Все эти операции линейной алгебры (включая операцию транспонирования) будут подробно рассмотрены в главе, специально посвящённой решению математических задач с помощью системы MATLAB.

Для поэлементных операций традиционные значки предваряются точкой. То есть поэлементное перемножение массивов обозначается .* и поэтому следующее равенство очевидно:

A .* B == [ 0 0 0 ; 14 14 14 ; 3 6 9 ];

Соответственно, выражение A.^2 позволяет возвести в квадрат каждый элемент матрицы A . При поэлементном умножении на скаляр производится «расширение скаляра до матрицы«, или по-другому можно сказать, что на скаляр умножается каждый элемент матрицы:

A .* 4 == [ 4 4 4 ; 8 8 8 ; 12 12 12 ];

Для поэлементного деления используются комбинации знаков ./ и . ,

обозначающие «правое и левое» поэлементные деления. Выражение A./B приводит к матрице с элементами A(k,m)/B(k,m) , а выражение A. B приводит к матрице с элементами B(k,m)/A(k,m). Обе матрицы должны иметь одинаковые размеры, в случае скаляра производится его расширение до размеров операнда-матрицы. Например,

6 ./ A == [ 6 6 6 ; 3 3 3 ; 2 2 2 ];

Операции отношения и логические операции используют в случае матриц те же самые значки и выполняют поэлементные действия. В случае скаляра производится его «расширение«. Выполним сравнение матриц A и B , используя операцию «меньше или равно«:

Здесь каждый нуль означает «ложь» для данной позиции внутри матриц, а единица означает «истину«. Полученная матрица показывает (единицами), в каких позициях элементы матрицы A на самом деле меньше или равны соответствующим элементам матрицы B .

Операции сравнения для массивов часто комбинируются с вызовом функции find . Действительно, представим, что для массива v = [ 1 3 6 7 0 ] все элементы, большие единицы, нужно сделать равными 9 . Эта задача решается с помощью следующего выражения:

Поясним работу этого выражения. Функция find возвращает набор (массив) номеров тех элементов вектора v , для которых записанное неравенство v > 1 действительно имеет место. Ясно, что это номера [ 2 3 4 ] . Затем эти номера поступают на вход операции индексации массива v , что и обеспечивает присвоение девятки второму, третьему и четвёртому элементам v :

Таким образом, все элементы, большие единице, стали равны девяти.

Работу логических операций продемонстрируем на только что полученном новом значении вектора v , применив к нему операцию «НЕ»:

Математические функции, рассмотренные нами ранее в п.4, допускают использование не только скалярных аргументов, но и аргументов-массивов. В результате с помощью крайне компактных записей удаётся произвести большой объём вычислений. Например, выражения

x = 0 : 0.01 : pi/2; y = sin(x);

позволяют осуществить вычисления функции sin сразу в 158 точках. В результате мы имеем массив аргументов x (всего 158 значений) и массив y значений функции (также 158 элементов). Этих двух массивов уже достаточно для построения подробного графика функции sin . В системе MATALB эти два массива можно подать на вход специальной функции, автоматически производящей построение графиков функций. Эта техника будет рассмотрена в следующей главе.

А сейчас приближённо решим уравнение

Для этого нам потребуется записать всего лишь одно выражение:

В результате вычислений получается приближённый корень: res = 0.3200 . Так как шаг вычислений был выбран равным 0.01, то мы можем надеяться, что корень найден с точностью не хуже 0.01. Для проверки точности найденного корня вычисляем asin(0.315) :

Читать еще:  Размерность матрицы matlab

Отсюда видно, что наше предположение о точности найденного корня полностью подтверждается.

Математические пакеты (MATLAB).

Работа с матрицами.

Матрица — прямоугольная таблица.

dim A (dimention — размерность) = n*m.

Это означает, что матрица имеет n строк и m столбцов.

    Матрицы:
  • 1*m — матрица-строка;
  • n*1 — матрица-столбец;
  • n*n — квадратная матрица.

Квадратная матрица — важнейший частный случай.

Если элементы главной диагонали равны 1, а остальные равны 0, то такая матрица называется «единичной» (обозначение: E или I).

Пример: определить матрицу для системы MATLAB.

Решение: в системе MATLAB для матриц применяются буквенные обозначения. Множество элементов записывается в квадратных скобках «[]»; элементы одной строки записываются через запятую или через пробел, строки разделяются точкой с запятой «;».

A = [3 2; 1 4];
или
A = [3 2; 1 4]

A = [3, 2; 1, 4];
или
A = [3, 2; 1, 4]

Рассмотрим различия между строками: очевидно, различие между парами строк состоит лишь в использовании запятой или пробела (см. выше). Другой вопрос — использовать ли точку с запятой в конце строки?

Если Вы хотите, чтобы система MatLab отобразила результат операции в рабочем поле, точку с запятой ставить не нужно.

Приведем результаты работы программ:

Без точки с запятой:

С точкой с запятой:

Любое число является матрцей размерностью 1*1.

Действия над матрицами:

  1. A+B — сложение (размерности матиц должны совпадать): A+B = [aij+bij] — складываются соответственнае элементы. Команда MATLAB: A+B;
  2. c*A — умножение на скаляр (с — скаляр, т.е. какое-то число). Команда MATLAB: 2*A;
  3. A*B — умножение матриц (количество столбцов первой матрицы должно быть равно количеству строк второй). Итоговая матрица имеет размерность: * . Команда MATLAB: A*B;

Внимание! A*B не равно(!) B*A.

Для матриц не определена операция деления (X = b/A). Зато есть операция нахождения обратной матрицы (Команда MATLAB: A -1 ). Тогда X = A -1 *b. Команда MATLAB: X = A^(-1).

Умножение матриц (MATLAB).

Узнать, как математически выполняется умножение матриц, можно в соответствующем разделе: Математика/Умножение матриц.

В MATLAB у множение записывается при помощи оператора * или .* (для поэлементного умножения).

Пример: выполнить умножение матриц в системе MATLAB:

    Команды MATLAB:
  1. A = [0 1 -1; 0 2 1];
  2. B = [1 2; -1 0; 0 1];
  3. A*B;

Определитель квадратной матрицы.

Естественно, необходимо знать, как математически вычисляется определитель матриц. Почитайте в соответствующем разделе: Математика/Определитель (детерминант) матрицы.

В MATLAB нахождение определителя записывается при помощи команды det( ).

Пример: найти определитель матрицы A = [0 1; 2 0] с помощью MATLAB.

Обратная матрица.

Обязательно прочитайте, как математически вычисляется обратная матрица, в соответствующем разделе: Математика/Нахождение обратных матриц.

В MATLAB нахождение обратных матриц записывается при помощи команды ^(-1).

Пример: найти обратную матрицу для A = [2 3 1; 2 8 0; 5 6 3] с помощью MATLAB.

    Команды MATLAB:
  1. A = [2 3 1; 2 8 0; 5 6 3];
  2. A^(-1)

Ответ: A -1 =[12 -1.5 -4; -3 0.5 1; -14 1.5 5].

Поэлементное умножение матриц matlab

В системе MatLab достаточно просто выполняются математические операции над матрицами и векторами. Рассмотрим сначала простые операции сложения и умножения матриц и векторов. Пусть даны два вектора

a = [1 2 3 4 5]; % вектор-строка
b = [1; 1; 1; 1; 1]; % вектор-столбец

тогда умножение этих двух векторов можно записать так

c = a*b; % c=1+2+3+4+5=16
d = b*a; % d – матрица 5х5 элементов

В соответствии с операциями над векторами, умножение вектор-строки на вектор-столбец дает число, а умножение вектор-столбца на вектор-строку дает двумерную матрицу, что и является результатом вычислений в приведенном примере, т.е.

Сложение и вычитание двух векторов записывается так

a1 = [1 2 3 4 5];
a2 = [5 4 3 2 1];
c = a1+a2; % c = [1+5, 2+4, 3+3, 4+2, 5+1];
с = a2-a1; % c = [5-1, 4-2, 3-3, 2-4, 1-5];

Следует обратить внимание, что операции сложения и вычитания можно выполнять между двумя векторами-столбцами или двумя векторами-строками. Иначе MatLab выдаст сообщение об ошибке, т.к. разнотипные векторы складывать нельзя. Так обстоит дело со всеми недопустимыми арифметическими операциями: в случае невозможности их вычисления система MatLab сообщит об ошибке и выполнение программы будет завершено на соответствующей строке.

Аналогичным образом выполняются операции умножения и сложения между матрицами:

A = [1 2 3; 4 5 6; 7 8 9];
B = ones(3);
C = A+B; % сложение двух матриц одинакового размера
D = A+5; % сложение матрицы и числа
E = A*B; % умножение матрицы А на В
F = B*A; % умножение матрицы В на А
G = 5*A; % умножение матрицы на число

Читать еще:  Сформулируйте цели защиты информации

Операции вычисления обратной матрицы, а также транспонирования матриц и векторов, записываются следующим образом:

a = [1 1 1]; % вектор-строка
b = a’; % вектор-столбец, образованный
% транспонированием вектора-строки а.
A = [1 2 3; 4 5 6; 7 8 9]; % матрица 3х3 элемента
B = a*A; % B = [12 15 18] – вектор-строка
C = A*b; % C = [6; 15; 24] – вектор-столбец
D = a*A*a’; % D = 45 – число, сумма эл-ов матрицы А
E = A’; % E – транспонированная матрица А
F = inv(A); % F – обратная матрица А
G = A^-1; % G – обратная матрица А

Из приведенного примера видно, что операция транспонирования матриц и векторов обозначается символом ‘ (апостроф), который ставится после имени вектора или матрицы. Вычисление обратной матрицы можно делать путем вызова функции inv() или возводя матрицу в степень -1. Результат в обоих случаях будет одинаковым, а два способа вычисления сделано для удобства использования при реализации различных алгоритмов.

Если в процессе вычислений требуется поэлементно умножить, разделить или возвести в степень элементы вектора или матрицы, то для этого используются операторы:

.* — поэлементное умножение;
./ и . — поэлементные деления;
.^ — поэлементное возведение в степень.

Рассмотрим работу данных операторов на следующем примере.

a = [1 2 3]; % вектор-строка
b = [3 2 1]; % вектор-строка
c = a.*b; % c = [3 4 3]
A = ones(3); % матрица 3х3, состоящая из единиц
B = [1 2 3;4 5 6; 7 8 9]; % матрица 3х3
C = A.*B; % матрица 3х3, состоящая из
D = A./B; % матрица 3х3, состоящая из
E = A.B; % матрица 3х3, состоящая из
F = A.^2; % возведение элементов матрицы А в квадрат

В заключении данного параграфа рассмотрим несколько функций полезных при работе с векторами и матрицами.

Для поиска максимального значения элемента вектора используется стандартная функция max(), которая возвращает найденное максимальное значение элемента и его позицию (индекс):

a = [1 6 3 4];
[v, i] = max(a); % v = 6, i = 2;

Приведенный пример показывает два разных способа вызова функции max(). В первом случае определяется и максимальное значение элемента и его индекс в векторе, а во втором – только максимальное значение элемента.

В случае с матрицами, данная функция определяет максимальные значения, стоящие в столбцах, как показано ниже в примере:

A = [4 3 5; 6 7 2; 3 1 8];
[V, I] = max(A); % V=[6 7 8], I = [2 2 3]
V = max(A); % V=[6 7 8]

Полный синтаксис функции max() можно узнать, набрав в командном окне MatLab команду

Аналогичным образом работает функция min(), которая определяет минимальное значение элемента вектора или матрицы и его индекс.

Другой полезной функцией работы с матрицами и векторами является функция sum(), которая вычисляет сумму значений элементов вектора или столбцов матрицы:

a = [3 5 4 2 1];
s = sum(a); % s = 3+5+4+2+1=15
A = [4 3 5; 6 7 2; 3 1 8];
S1 = sum(A); % S1=[13 11 15]
S2 = sum(sum(A)); % S2=39

При вычислении суммы S2 сначала вычисляется сумма значений элементов матрицы А по столбцам, а затем, по строкам. В результате, переменная S2 содержит сумму значений всех элементов матрицы А.

Для сортировки значений элементов вектора или матрицы по возрастанию или убыванию используется функция sort() следующим образом:

b1 = sort(a); % b1=[1 2 3 4 5]
b2 = sort(a, ‘descend’); % b2=[5 4 3 2 1]
b3 = sort(a, ‘ascend’); % b3=[1 2 3 4 5]

A = [4 3 5; 6 7 2; 3 1 8];
B1 = sort(A); % B1=[3 1 2
% 4 3 5
% 6 7 8]
B2 = sort(A, ‘descend’); % B2=[6 7 8
% 4 3 5
% 3 1 2]

Во многих практических задачах часто требуется найти определенный элемент в векторе или матрице. Это можно выполнить с помощью стандартной функции find(), которая в качестве аргумента принимает условие, в соответствии с которым и находятся требуемые элементы, например:

a = [3 5 4 2 1];
b1 = find(a == 2); % b1 = 4 – индекс элемента 2
b2 = find(a

= 2); % b2 = [1 2 3 5] – индексы без 2
b3 = find(a > 3); % b3 = [2 3]

В приведенном примере символ ‘==’ означает проверку на равенство, а символ ‘

=’ выполняет проверку на неравенство значений элементов вектора а. Более подробно об этих операторах будет описано в разделе условные операторы.

Еще одной полезной функцией работы с векторами и матрицами является функция mean() для вычисления среднего арифметического значения, которая работает следующим образом:

a = [3 5 4 2 1];
m = mean(a); % m = 3
A = [4 3 5; 6 7 2; 3 1 8];
M1 = mean(A); % M1 = [4.333 3.667 5.000]
M2 = mean(mean(A)); % M2 = 4.333

© 2020 Научная библиотека

Копирование информации со страницы разрешается только с указанием ссылки на данный сайт

Поэлементное умножение матриц matlab

Так как массивы явяляются самыми распространёнными и самыми ценными типами данных в системе MATLAB, то важно подробно рассмотреть все нюансы вычислений с ними. Ранее (п.2) мы рассмотрели действие арифметических, логических операций и операций сравнения в частном случае скаляров (массив размера 1×1). Теперь повторим это рассмотрение для случая массивов.

Читать еще:  Matlab целая часть числа

Начнём с арифметических операций. Операции сложения и вычитания осуществляются с массивами поэлементно и обозначаются теми же самыми традиционными значками. Если A = [ 1 1 1; 2 2 2; 3 3 3 ] ; B = [ 0 0 0; 7 7 7; 1 2 3 ] , то справедливо равенство

A + B == [ 1 1 1 ; 9 9 9 ; 4 5 6 ];

Складываемые (вычитаемые) матрицы должны иметь одинаковые размеры. Допускается исключение — если одно из слагаемых является скаляром. В этом случае производится генерация матрицы с таким же размером, как и у матричного слагаемого, причём все её элементы одинаковые и равны исходному скаляру. Например,

A + 5 == [ 6 6 6 ; 7 7 7 ; 8 8 8 ];

То есть до выполнения поэлементного матричного сложения из скаляра 5 получают безымянную матрицу [ 5 5 5; 5 5 5; 5 5 5 ] , которую и складывают с A .

Теперь рассмотрим умножение и деление (а также возведение в степень). Здесь традиционные значки зарезервированы за действиями линейной алгебры: знак * означает перемножение матриц (а также вектор-строк и вектор-столбцов) по широко известному правилу «строка на столбец«. Традиционный знак деления / (а также знак ) закреплён за «операцией нахождения решений систем линейных уравнений«. Все эти операции линейной алгебры (включая операцию транспонирования) будут подробно рассмотрены в главе, специально посвящённой решению математических задач с помощью системы MATLAB.

Для поэлементных операций традиционные значки предваряются точкой. То есть поэлементное перемножение массивов обозначается .* и поэтому следующее равенство очевидно:

A .* B == [ 0 0 0 ; 14 14 14 ; 3 6 9 ];

Соответственно, выражение A.^2 позволяет возвести в квадрат каждый элемент матрицы A . При поэлементном умножении на скаляр производится «расширение скаляра до матрицы«, или по-другому можно сказать, что на скаляр умножается каждый элемент матрицы:

A .* 4 == [ 4 4 4 ; 8 8 8 ; 12 12 12 ];

Для поэлементного деления используются комбинации знаков ./ и . ,

обозначающие «правое и левое» поэлементные деления. Выражение A./B приводит к матрице с элементами A(k,m)/B(k,m) , а выражение A. B приводит к матрице с элементами B(k,m)/A(k,m). Обе матрицы должны иметь одинаковые размеры, в случае скаляра производится его расширение до размеров операнда-матрицы. Например,

6 ./ A == [ 6 6 6 ; 3 3 3 ; 2 2 2 ];

Операции отношения и логические операции используют в случае матриц те же самые значки и выполняют поэлементные действия. В случае скаляра производится его «расширение«. Выполним сравнение матриц A и B , используя операцию «меньше или равно«:

Здесь каждый нуль означает «ложь» для данной позиции внутри матриц, а единица означает «истину«. Полученная матрица показывает (единицами), в каких позициях элементы матрицы A на самом деле меньше или равны соответствующим элементам матрицы B .

Операции сравнения для массивов часто комбинируются с вызовом функции find . Действительно, представим, что для массива v = [ 1 3 6 7 0 ] все элементы, большие единицы, нужно сделать равными 9 . Эта задача решается с помощью следующего выражения:

Поясним работу этого выражения. Функция find возвращает набор (массив) номеров тех элементов вектора v , для которых записанное неравенство v > 1 действительно имеет место. Ясно, что это номера [ 2 3 4 ] . Затем эти номера поступают на вход операции индексации массива v , что и обеспечивает присвоение девятки второму, третьему и четвёртому элементам v :

Таким образом, все элементы, большие единице, стали равны девяти.

Работу логических операций продемонстрируем на только что полученном новом значении вектора v , применив к нему операцию «НЕ»:

Математические функции, рассмотренные нами ранее в п.4, допускают использование не только скалярных аргументов, но и аргументов-массивов. В результате с помощью крайне компактных записей удаётся произвести большой объём вычислений. Например, выражения

x = 0 : 0.01 : pi/2; y = sin(x);

позволяют осуществить вычисления функции sin сразу в 158 точках. В результате мы имеем массив аргументов x (всего 158 значений) и массив y значений функции (также 158 элементов). Этих двух массивов уже достаточно для построения подробного графика функции sin . В системе MATALB эти два массива можно подать на вход специальной функции, автоматически производящей построение графиков функций. Эта техника будет рассмотрена в следующей главе.

А сейчас приближённо решим уравнение

Для этого нам потребуется записать всего лишь одно выражение:

В результате вычислений получается приближённый корень: res = 0.3200 . Так как шаг вычислений был выбран равным 0.01, то мы можем надеяться, что корень найден с точностью не хуже 0.01. Для проверки точности найденного корня вычисляем asin(0.315) :

Отсюда видно, что наше предположение о точности найденного корня полностью подтверждается.

Ссылка на основную публикацию
Adblock
detector