Распределённые массивы хорошо подходят для больших математических вычислений, таких как большие задачи линейной алгебры. В этом примере показано, как можно решить систему линейных уравнений вида b параллельно с прямым методом с помощью распределенных массивов. Так же, как и для массивов, хранящихся в памяти клиента, можно использоватьmldivide для решения может систем линейных уравнений, определенных с помощью распределенных массивов, поэтому нет необходимости изменять код.
Распределенные массивы распределяют данные из рабочей области клиента в параллельный пул на локальном компьютере или в кластере. Каждый работник сохраняет часть массива в своей памяти, но также может взаимодействовать с другими работниками для доступа ко всем сегментам массива. Распределенные массивы могут содержать различные типы данных, включая полные и разреженные матрицы.
Прямые методы решения линейных уравнений обычно факторизируют матрицу коэффициентов для вычисления решения. mldivide выбирает один из набора методов прямого решателя в зависимости от структуры и от того, является ли полным или разреженным.
Этот пример демонстрирует, как решить простую систему линейных уравнений вида b с точным, известным x. Система определяется A и b. x также является вектором-столбцом. В этом примере система определяется с использованием полных и разреженных матриц. Требуемый код одинаков для систем, определенных с использованием распределенных массивов или массивов в клиентской памяти.
Связанный пример использования итеративных решателей и распределенных массивов см. в разделе Использование распределенных массивов для решения систем линейных уравнений итерационными методами.
Сначала определите матрицу коэффициентов как переменную в памяти клиента, A, а затем передать эту матрицу в distributed для создания распределенной версии той же матрицы, ADist. При использовании distributed функция MATLAB автоматически запускает параллельный пул с использованием настроек кластера по умолчанию.
n = 1e3; A = randi(100,n,n); ADist = distributed(A);
Теперь можно определить правый вектор . В этом примере определяется как сумма строк , что приводит к точному решению b , 1] T.
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'));Для некоторых типов матрицы A больших и разреженных коэффициентов существуют более эффективные методы, чем прямая факторизация для решения ваших систем. В этих случаях итеративные методы могут быть более эффективными при решении вашей системы линейных уравнений. Итеративные методы генерируют ряд приближенных решений, которые сходятся к конечному результату. Пример использования итерационных методов для решения линейных уравнений с большими разреженными входными матрицами см. в разделе Использование распределенных массивов для решения систем линейных уравнений с помощью итеративных методов.
distributed | mldivide | sparse