分布式数组非常适合于大型数学计算,例如线性代数的大型问题。这个例子展示了如何求解这种形式的线性方程组
与使用分布式阵列的直接方法并行。与存储在客户端内存中的数组相同,您可以使用mldivide
要解决使用分布式数组定义的线性方程组,因此不需要更改代码。
分布式数组将数据从客户机工作区分发到本地机器或集群中的并行池。每个worker在其内存中存储数组的一部分,但也可以与其他worker通信以访问数组的所有段。分布式数组可以包含不同类型的数据,包括完整矩阵和稀疏矩阵。
求解线性方程的直接方法通常是将系数矩阵因式分解
计算解。mldivide
的结构,选择一组直接求解器方法之一
以及是否
是满的或稀疏的。
这个例子演示了如何求解一个简单的线性方程组的形式 用一个精确的,已知的解决方案 .系统由矩阵定义 而列向量 .解决方案 也是一个列向量。在本例中,系统是使用完整和稀疏矩阵定义的。对于使用分布式数组或客户机内存上的数组定义的系统,所需的代码是相同的。
有关显示如何使用迭代求解器和分布式数组的相关示例,请参见用分布式阵列迭代法求解线性方程组.
首先定义系数矩阵
作为客户端内存中的变量,一个
,然后将这个矩阵传递给分布式
函数创建相同矩阵的分布式版本,ADist
.当你使用分布式
函数,MATLAB使用默认集群设置自动启动并行池。
N = 1e3;A = randi(100,n,n);ADist =分布式(A);
现在可以定义右手向量了 .在这个例子中, 定义为?的行和 的精确解 形式的 .
b = sum(A,2);bDist = sum(ADist,2);
自总和
作用于分布式数组,bDist
也是分布式的,其数据存储在并行池的工作线程的内存中。最后,定义精确解,以便与使用直接数值方法得到的解进行万博 尤文图斯比较。
xEx = ones(n,1);xDistEx = ones(n,1,“分布式”);
现在你已经定义了线性方程组,你可以使用mldivide
直接求解方程组。在MATLAB中,你可以调用mldivide
使用特殊操作符\
.你不需要改变你的代码来解决分布式系统mldivide
自动支持分布式数组。万博1manbetx
一旦计算出解决方案,就可以检查得到的结果的每个元素之间的误差 的期望值 .
x = A\b;err = abs(xx -x);xDist = ADist\bDist;errDist = abs(xDistEx-xDist);图(2,1,1)符号(err,“o”);标题(全矩阵线性方程组);ylabel (的绝对误差);包含(' x中的元素');ylim([10e-17,10e-13]) subplot(2,1,2) semological (errDist,“o”);标题(“分布全矩阵线性方程组”);ylabel (的绝对误差);包含(' x中的元素');ylim ([10 e-17, e-13])
对于分布式数组和存储在客户端上的数组,计算结果之间的绝对误差为 准确的结果是 很小。对于这两种数组类型,解决方案的精度大致相同。
意思是(err)
Ans = 1.6031e-13
意思是(errDist)
Ans = 1.2426e-13
分布式数组也可以包含稀疏数据。来创建系数矩阵
,使用sprand
而且speye
直接生成一个由随机数组成的稀疏矩阵加上稀疏单位矩阵。添加单位矩阵有助于防止创建
作为一个奇异或近似奇异矩阵,这两者都很难分解。
N = 1e3;密度= 0.2;A = sprand(n,n,密度)+ speye(n);ADist =分布式(A);
选择右边的向量 的行和 得到与完整矩阵系统的解形式相同的精确解。
b = sum(A,2);bDist = sum(ADist,2);xEx = ones(n,1);xDistEx = ones(n,1,“分布式”);
用与全矩阵相同的方法,你现在可以直接用mldivide
并检查得到的结果与预测值之间的误差。
x = A\b;err = abs(xx -x);xDist = ADist\bDist;errDist = abs(xDistEx-xDist);图(2,1,1)符号(err,“o”);标题(带客户端稀疏矩阵的线性方程组);ylabel (的绝对误差);包含(' x中的元素');ylim([10e-17,10e-13]) subplot(2,1,2) semological (errDist,“o”);标题(“分布稀疏矩阵线性方程组”);ylabel (的绝对误差);包含(' x中的元素');ylim ([10 e-17, e-13])
与全矩阵系统一样,使用客户端阵列和分布式阵列求解线性方程组的结果具有相当的精度。万博 尤文图斯
意思是(err)
Ans = 1.6031e-13
意思是(errDist)
Ans = 1.2426e-13
在完成计算之后,可以删除并行池。的gcp
函数返回当前并行池对象,以便您可以删除当前池。
删除(gcp (“nocreate”));
对于某些类型的大而稀疏的系数矩阵 ,有比直接因式分解更有效的方法来求解系统。在这些情况下,迭代方法在求解线性方程组时可能更有效。迭代方法生成一系列近似解,收敛到最终结果。万博 尤文图斯有关如何使用迭代方法求解具有大型稀疏输入矩阵的线性方程的示例,请参见用分布式阵列迭代法求解线性方程组.