Распределенные массивы хорошо подходят для больших математических расчетов, таких как большие задачи линейной алгебры. Этот пример показывает, как можно решить систему линейных уравнений вида параллельно с прямым методом, использующим распределенные массивы. Так же, как и для массивов, хранящихся в памяти клиента, можно использовать 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])
Как и в полной матричной системе, решение системы линейных уравнений с помощью как on-client массивов, так и распределенных массивов вырабатывает решения с сопоставимой точностью.
mean(err)
ans = 1.6031e-13
mean(errDist)
ans = 1.2426e-13
После завершения расчетов можно удалить параллельный пул. The gcp
функция возвращает текущий объект параллельного пула, чтобы можно было удалить текущий пул.
delete(gcp('nocreate'));
Для некоторых типов большой и разреженной матрицы коэффициентов , существуют более эффективные методы, чем прямая факторизация для решения ваших систем. В этих случаях итерационные методы могут быть более эффективными при решении вашей системы линейных уравнений. Итерационные методы генерируют ряд приблизительных решений, которые сходятся к конечному результату. Для примера того, как использовать итерационные методы для решения линейных уравнений с большими, разреженными входными матрицами, смотрите Использование Распределенных Массивов для Решения Систем Линейных Уравнений с Итерационными методами.
distributed
| mldivide
| sparse