CUDA矩阵求逆的问题,求助

qq_29715491 2016-03-30 05:11:43
用C实现了通过高斯约旦算法求矩阵逆,现在想改成CUDA并行实现,但是学CUDA时间不长,脑袋有点大现在。不知道有没有做过的大神,贴上代码,或者指导一下。自己琢磨真心觉得累觉不爱,怀疑人生。

算法是这样的:待求逆的矩阵A,单位矩阵E,然后利用初等变换、消元法啥的对(A|E)矩阵进行消元,变成(E|A逆)。
C代码:void juzhen_ni(double A[],int N)
{
double *B;
B = (double *)malloc(sizeof(double)*2*N*N);
//memset(B,0,sizeof(double)*2*N*N);
int i,j,k,l;
for(i=0;i<N;++i)
{
for(j=0;j<2*N;++j)
{
B[i*2*N+j]=(j-i==N)?1:0;//保存矩阵A与E的组合矩阵,先确定E
}
}
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
B[i*2*N+j]=A[i*N+j];//矩阵A的值赋给B
}
}
double ij;
for(i=0;i<N;i++)
{
if(B[i*2*N+i]!=0)
ij=B[i*2*N+i];
else
{
for(j=i+1;j<N;++j)
if(B[j*2*N+i]!=0)
break;
if(j>=N)
printf("矩阵不可逆");//失败
return;
for(k=0;k<=2*N;++k)//将第j行加到第ii行
B[i*2*N+k]+=B[j*2*N+k];
ij=B[i*2*N+i];
}
for(l=i;l<2*N;l++)//将i行i列变为1,i行i列之后的元素除以B[i][i]
B[i*2*N+l]/=ij;
for(k=N-1;k!=i;k--)
for(l=i,ij=B[k*2*N+i];l<2*N;l++)
B[k*2*N+l]-=ij*B[i*2*N+l];

}
for(i=N-1;i>=1;i--)
{
for(k=0;k!=i;k++)
for(l=i,ij=B[k*2*N+i];l<2*N;l++)
B[k*2*N+l]-=ij*B[i*2*N+l];
}
for(i=0;i<N;i++)
for(j=N;j<2*N;j++)
A[i*N+j-N]=B[i*2*N+j];
free(B);
}
...全文
710 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
summer_uestc 2016-04-05
  • 打赏
  • 举报
回复
没人回答一下吗

2,408

社区成员

发帖
与我相关
我的任务
社区描述
高性能计算
社区管理员
  • 高性能计算社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧