Матричная магия: часть 1 - Суммирование в мгновение ока!
Запись от Зосима размещена 01.02.2013 в 18:27
Показов 10130
Комментарии 18
Метки math, matlab, вектор, математика, матрица
|
Очень часто возникают задачи посчитать сумму ряда. В традиционных языках программирования для этого используются циклы, в матлабе же есть замечательная встроенная функция sum, которая одним махом находит сумму элементов массива или столбцов матрицы! ![]() Но я расскажу еще об одном способе: матричном заклинании которое считает сумму быстрее первых двух способов! ![]() Вспомним правило матричного умножения: элемент новой матрицы равен сумме произведений строки первой матрицы на столбец второй. Теперь, если допустить, что первая матрица - вектор-строка, а второй вектор-столбец, то результат будет числом, равным сумме поэлементных произведений! В этом вся соль! Главное, чтобы длины векторов совпадали и соблюдалась ориентация!!! Так, для вычисления суммы элементов вектора-строки x достаточно матрично умножить его на вектор-столбец из единичек! А так как матлаб заточен и оптимизирован под матричные операции, такой способ работает очень быстро! Для сравнения различных алгоритмов суммирования в матлаб я набросал простенькую программку: Программа MATLAB
Она генерирует произвольные массивы х с длинами от 101 до 107, считает сумму тремя различными способами, засекает время расчета каждого, сохраняет результат и рисует график. Получаем такую зависимость: Отсюда можно сделать такие выводы: - суммирование в цикле сообразно использовать, если длинна массива меньше ~200. Однако, в данном случае, в цикле нет доп. вычислений и условий, которые есть в реальном задании, поэтому от циклов лучше по возможности уходить ![]() - матричное умножение считается быстрее встроенной ф-ции, а при длине массива болше ~105 разница между ними становится значительной. Поэтому для массивов больших размерностей предпочтительней использовать матричное умножение ![]() Ну и на закуску приведу пример вычисления рядов матричным умножением. Рассчет экспоненты:
Вообщем направление я Вам дал, а дальше, все зависит от ![]() Список тем, где был применен данный метод: https://www.cyberforum.ru/post3697347.html и https://www.cyberforum.ru/post3699099.html https://www.cyberforum.ru/post3811787.html (см. под кат) В следующей части расскажу, как из двух векторов любой длины, при помощи матричной магии , создать матрицу и как это можно применить на практике.
| |||||||||||||||
Метки math, matlab, вектор, математика, матрица
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 18
Комментарии
-
Спасибо за курс магии)) Решал задачку здесь предложным тобою методом, но все ровно находятся умельцы по оптимизации кода (смотри карту решений
).Запись от R2D2 размещена 03.04.2013 в 11:20
-
И как же эта sum реализована, если не теми же циклами?Запись от размещена 03.04.2013 в 12:24 -
Запись от Зосима размещена 03.04.2013 в 18:16
-
Умножение же матриц вообще не реализуемо ни как, кроме цикла.Запись от размещена 03.04.2013 в 19:23 -
Еще раз подчеркну, что мне достоверно не известно как именно разработчики реалиовали функцию sum и матричное умножение
Существуют быстрые алгоритмы перемножения матриц, которые вероятно и были использованы.
Смысл статьи не в "порицании" циклов, а в ознакомлении с несправедливо пренебрегаемыми матричными действиями в MATLAB
Политика создателей программы направлена на уход от обычных циклов без премудростей (хотя не всегда можно обойтись без них), т.к. они увеличивают время вычислений
что мы и видим на простом примере суммирования элементов вектора.
Кстать, интересный алгоритм! я вот только не совсем "догнал" программную реализацию: подумал, что частичные суммы на каждом шагу так же считаются в цикле и получаем двойной цикл: так для 1024 элементов внешний будет иметь 10 шагов, а внутренний 512, 256, 128... Или я не правильно понял?
Запись от Зосима размещена 04.04.2013 в 07:06
-
Запись от Зосима размещена 04.04.2013 в 10:56
-
Выигрыш всего в 2,667 раза.Запись от размещена 04.04.2013 в 11:45 -
Ну можно ещё несколько ядер/процессоров попробовать использовать.Запись от размещена 04.04.2013 в 11:47 -
Ясненько, тут скорее паяльник нужен
для домохозяйки считающей минимум расстояний между пылинками на разных кадрах, например, этот метод не подходит 
Запись от Зосима размещена 04.04.2013 в 11:52
-
Массированный параллелизм ожидается к пятому поколению.Запись от размещена 04.04.2013 в 13:14




, создать матрицу и как это можно применить на практике.



