Распределенные массивы являются подходящими для больших математических вычислений, такими как большие проблемы линейной алгебры. Этот пример показывает, как можно решить систему линейных уравнений формы параллельно с прямым методом с помощью распределенных массивов. Таким же образом что касается массивов, сохраненных в клиентской памяти, можно использовать mldivide
, чтобы решить, может системы линейных уравнений, определенных с помощью распределенных массивов, таким образом, вы не должны изменять свой код.
Распределенные массивы распределяют данные от вашей клиентской рабочей области до параллельного пула в вашей локальной машине или в кластере. Каждый рабочий хранит фрагмент массива в его памяти, но может также связаться с другими рабочими, чтобы получить доступ ко всем сегментам массива. Распределенные массивы могут содержать различные типы данных включая полный и разреженные матрицы.
Прямые методы решения линейных уравнений обычно разлагают на множители матрицу коэффициентов вычислить решение. mldivide
выбирает один из набора прямых методов решателя в зависимости от структуры и ли полно или разрежен.
Этот пример демонстрирует, как решить простую систему линейных уравнений формы с точным, известным решением . Система задана матрицей и вектор-столбец Решение также вектор-столбец. В этом примере система задана с помощью полного и разреженные матрицы. Необходимый код является тем же самым для систем, заданных с помощью распределенных массивов или массивов на клиентской памяти.
Для связанного примера, который показывает, как использовать итеративные решатели и распределенные массивы, смотрите Использование Распределенные Массивы, чтобы Решить Системы Линейных уравнений с Итерационными методами.
Сначала задайте матрицу коэффициентов как переменная в клиентской памяти, A
, и затем передают эту матрицу функции distributed
, чтобы создать распределенную версию той же матрицы, ADist
. Когда вы используете функцию distributed
, MATLAB автоматически запускает параллельный пул с помощью кластерных настроек по умолчанию.
n = 1e3; A = randi(100,n,n); ADist = distributed(A);
Можно теперь задать самый правый вектор . В этом примере, задан как сумма строки , который приводит к точному решению из формы .
b = sum(A,2); bDist = sum(ADist,2);
Начиная с действий sum
на распределенном массиве также распределяется bDist
, и его данные хранятся в памяти о рабочих вашего параллельного пула. Наконец, задайте точные решения для сравнения с решениями, полученными с помощью прямых численных методов.
xEx = ones(n,1);
xDistEx = ones(n,1,'distributed');
Теперь, когда вы задали свою систему линейных уравнений, можно использовать mldivide
, чтобы решить систему непосредственно. В MATLAB можно вызвать mldivide
с помощью специального оператора \
. Вы не должны изменять свой код, чтобы решить распределенную систему, когда mldivide
имеет автоматическую поддержку распределенных массивов.
Если вы вычислили решение, можно проверять ошибку между каждым элементом полученного результата и ожидаемые значения .
x = A\b; err = abs(xEx-x); xDist = ADist\bDist; errDist = abs(xDistEx-xDist); figure subplot(2,1,1) semilogy(err,'o'); title('System of Linear Equations with Full Matrices'); ylabel('Absolute Error'); xlabel('Element in x'); ylim([10e-17,10e-13]) subplot(2,1,2) semilogy(errDist,'o'); title('System of Linear Equations with Distributed Full Matrices'); ylabel('Absolute Error'); xlabel('Element in x'); ylim([10e-17,10e-13])
И для распределенных массивов и для массивов, сохраненных на клиенте, абсолютной погрешности между расчетными результатами для и точный результат является маленьким. Точность решения является приблизительно тем же самым для обоих типов массива.
mean(err)
ans = 1.6031e-13
mean(errDist)
ans = 1.2426e-13
Распределенные массивы могут также содержать разреженные данные. Создать матрицу коэффициентов , используйте sprand
и speye
, чтобы непосредственно сгенерировать разреженную матрицу случайных чисел плюс разреженная единичная матрица. Добавление единичной матрицы помогает предотвратить создание как сингулярная или почти сингулярная матрица, оба из которых трудно разложить на множители.
n = 1e3; density = 0.2; A = sprand(n,n,density) + speye(n); ADist = distributed(A);
Выбор самого правого вектора как сумма строки приводит к точному решению той же формы как решение полной матричной системы.
b = sum(A,2);
bDist = sum(ADist,2);
xEx = ones(n,1);
xDistEx = ones(n,1,'distributed');
Таким же образом как с полными матрицами, можно теперь решить эту систему линейных уравнений непосредственно с помощью mldivide
и проверять ошибку между полученным результатом и его ожидаемым значением.
x = A\b; err = abs(xEx-x); xDist = ADist\bDist; errDist = abs(xDistEx-xDist); figure subplot(2,1,1) semilogy(err,'o'); title('System of Linear Equations with In-Client Sparse Matrices'); ylabel('Absolute Error'); xlabel('Element in x'); ylim([10e-17,10e-13]) subplot(2,1,2) semilogy(errDist,'o'); title('System of Linear Equations with Distributed Sparse Matrices'); ylabel('Absolute Error'); xlabel('Element in x'); ylim([10e-17,10e-13])
Как с полной матричной системой, решая систему линейных уравнений с помощью и массивов на клиенте и распределенных массивов производит решения с сопоставимой точностью.
mean(err)
ans = 1.6031e-13
mean(errDist)
ans = 1.2426e-13
После того, как вы будете сделаны с вашими вычислениями, можно удалить параллельный пул. Функция gcp
возвращает текущий параллельный объект пула, таким образом, можно удалить текущий пул.
delete(gcp('nocreate'));
Для определенных типов большой и разреженной матрицы коэффициентов , существуют более эффективные методы, чем прямая факторизация для решения ваших систем. В этих случаях итерационные методы могут быть более эффективными при решении вашей системы линейных уравнений. Итерационные методы генерируют серию приближенных решений, которые сходятся к конечному результату. Для примера того, как использовать итерационные методы, чтобы решить линейные уравнения с большими, разреженными входными матрицами, смотрите Использование Распределенные Массивы, чтобы Решить Системы Линейных уравнений с Итерационными методами.
distributed
| mldivide
| sparse