Распределенные массивы являются подходящими для больших математических вычислений, такими как большие проблемы линейной алгебры. В этом примере показано, как можно решить систему линейных уравнений формы параллельно с прямым методом с помощью распределенных массивов. Таким же образом что касается массивов, сохраненных в клиентской памяти, можно использовать 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