C#中2个很大矩阵相乘,如何用多线程来实现?
3个回答
展开全部
a*b的矩阵乘b*c的矩阵得a*c的矩阵。
我们可以对a中的每一列分配一个线程进行单独计算。因为列中元素的值之间计算互不影响。
所以大致可以这样:
static double[,] MatrixMultiply(double[,] aMat, double[,] bMat)
{
int aRow = aMat.GetLength(0), aCol = aMat.GetLength(1);
int bRow = bMat.GetLength(0), bCol = bMat.GetLength(1);
if (aCol != bRow) throw new InvalidOperationException("矩阵无法相乘");
int cRow = aRow, cCol = bCol;
double[,] cMat = new double[cRow, cCol];
Action<int> calcRow = (r) =>
{
for (int i = 0; i < cCol; i++)
{
for (int j = 0; j < aRow; j++)
{
cMat[i, r] = cMat[i, r] + aMat[j, i] * bMat[r, j];
}
}
};
Parallel.For(0, cRow, calcRow); //直接使用Parallel.For来处理并行,而不需要自己控制线程。
/*
不并行的话就是这样。
for (int i = 0; i < cRow; i++)
{
calcRow(i);
}
*/
return cMat;
}
我们可以对a中的每一列分配一个线程进行单独计算。因为列中元素的值之间计算互不影响。
所以大致可以这样:
static double[,] MatrixMultiply(double[,] aMat, double[,] bMat)
{
int aRow = aMat.GetLength(0), aCol = aMat.GetLength(1);
int bRow = bMat.GetLength(0), bCol = bMat.GetLength(1);
if (aCol != bRow) throw new InvalidOperationException("矩阵无法相乘");
int cRow = aRow, cCol = bCol;
double[,] cMat = new double[cRow, cCol];
Action<int> calcRow = (r) =>
{
for (int i = 0; i < cCol; i++)
{
for (int j = 0; j < aRow; j++)
{
cMat[i, r] = cMat[i, r] + aMat[j, i] * bMat[r, j];
}
}
};
Parallel.For(0, cRow, calcRow); //直接使用Parallel.For来处理并行,而不需要自己控制线程。
/*
不并行的话就是这样。
for (int i = 0; i < cRow; i++)
{
calcRow(i);
}
*/
return cMat;
}
展开全部
简单的线程的话,可以使用线程控件,很方便。
如果你想问的是超大的矩阵,计算数据量特别大的话,多线程也没办法提速,只能让你在计算的时候,软件可以响应你的系统消息。
如果你想问的是超大的矩阵,计算数据量特别大的话,多线程也没办法提速,只能让你在计算的时候,软件可以响应你的系统消息。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1.创建一个委托,并用一个函数接口实例化委托。
2.创建一个辅助线程,并用上面的委托初始化线程。
3.开启线程,注意在辅助线程结束后,返回主线程想要的数据。
2.创建一个辅助线程,并用上面的委托初始化线程。
3.开启线程,注意在辅助线程结束后,返回主线程想要的数据。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询