Fortran Coder

查看: 199|回复: 7

[求助] Fortran如何合并具有相同的性质的两列,并删除列

[复制链接]

3

帖子

1

主题

0

精华

新人

F 币
19 元
贡献
7 点
发表于 2022-7-22 16:00:16 | 显示全部楼层 |阅读模式
本帖最后由 jiangweiwu 于 2022-7-23 13:14 编辑

现在已知一个矩阵中所有的非零元素的行列值(u,v,a),但是这些行值与列值有重复的,如何将重复行列处的值相加,只保留一列,其余列都删除呢?

可以参见上传的图片,需要将两个圆圈处的a值相加,保留一个圈中的所有内容,剩下的另一个圈中的内容全部删掉。方框同理。最终变为下面的结果。
question.jpg
question.jpg

38

帖子

3

主题

0

精华

熟手

F 币
156 元
贡献
77 点
发表于 2022-7-22 20:25:15 | 显示全部楼层
不知所云,你这和稀疏矩阵有啥关系啊。再说稀疏矩阵的稀疏格式又不是一种,coo,csr,csc,格式不一样三元组的含义不同。然后你稀疏矩阵不会和Fortran有啥关系啊。

194

帖子

2

主题

0

精华

宗师

F 币
1468 元
贡献
767 点

规矩勋章

发表于 2022-7-23 11:25:31 | 显示全部楼层
我感觉用forall或者where会比较简单,但是我对这两个的语法不熟

3

帖子

1

主题

0

精华

新人

F 币
19 元
贡献
7 点
 楼主| 发表于 2022-7-23 13:19:23 | 显示全部楼层
zjk0112 发表于 2022-7-22 20:25
不知所云,你这和稀疏矩阵有啥关系啊。再说稀疏矩阵的稀疏格式又不是一种,coo,csr,csc,格式不一样三元 ...

我可能没表达清楚。你看下我新上传的照片。我现在得到了三个一维数组(维度是7)分别是u,v,a,但是需要将u,v值相同时所对应的a值进行相加,并且只保留一组,即如图中所示,最后u,v,a的维度变为了5。

660

帖子

2

主题

0

精华

大宗师

F 币
3255 元
贡献
2030 点
发表于 2022-7-24 19:03:00 | 显示全部楼层
你这个完全就是稀疏矩阵的操作,需要自己写代码实现。举例来说,如果想存为csr格式,就逐行处理。
!开辟一行的空间,假设处理第i行
real val(n)
val = 0
!判断是否为第i行数据
!获取数据列号 j
val(j) = val(j) + a

!统计第i行中非零数据的个数、列号、值,存入文件或其他空间

38

帖子

3

主题

0

精华

熟手

F 币
156 元
贡献
77 点
发表于 2022-7-25 09:53:39 | 显示全部楼层
本帖最后由 zjk0112 于 2022-7-25 10:21 编辑
zjk0112 发表于 2022-7-22 20:25
不知所云,你这和稀疏矩阵有啥关系啊。再说稀疏矩阵的稀疏格式又不是一种,coo,csr,csc,格式不一样三元 ...

你想要两个5阶的矩阵相加?只是这两个矩阵是稀疏的。是这个意思不?
做加法就行了。就用到for循环就可以了。

A=[1,2,3,*,*
      *,3,4,5,*
      *,*,5,6,7
      *,*,*,7,8
      *,*,*,*,9]
对应的COO格式三元组(1-based)就是IA=(/1,1,1,2,2,2,3,3,3,4,4,5/),JA=(/1,2,3,2,3,4,3,4,5,4,5,5/),VA=(/1.0,2.0,3.0,3.0,4.0,5.0,5.0,6.0,7.0,7.0,8.0,9.0/)

B=[1,*,*,*,*
      *,2,*,*,*
      *,*,3,*,*
      *,*,*,4,*
      *,*,*,*,5]
对应的COO格式三元组 IB=(/1,2,3,4,5/) JB=(/1,2,3,4,5/) VB=(/1.0,2.0,3.0,4.0,5.0/)

A+B伪代码
!nnz为非零元个数,n为矩阵阶数,
n=5, nnzA=12, nnzB=5
do i=1, nnzA
    do j=1,nnzB
       if(IA(i)==IB(j) .and. JA(i)==JB(j)) then
       C(IA(i),JA(i)) = VA(i)+VB(j)
    end do
end do

我没理解错的,大概就这样呗,不难吧。有啥不会的呢?

3

帖子

1

主题

0

精华

新人

F 币
19 元
贡献
7 点
 楼主| 发表于 2022-7-26 17:00:53 | 显示全部楼层
zjk0112 发表于 2022-7-25 09:53
你想要两个5阶的矩阵相加?只是这两个矩阵是稀疏的。是这个意思不?
做加法就行了。就用到for循环就可以了 ...

首先谢谢你的代码。不过不是两个稀疏矩阵相加。是有u,v,a三个一维数组,只不过这其中的u,v有相同值得时候,对应的a需要相加。
我写的是代码
allocate(u(nnz),v(nnz),a(nnz))  写的是有限元的代码,
所以所有的非零元素都在一个(sumNode*ndf,sumNode*ndf)的二维数组中
allocate(K(sumNode*ndf,sumNode*ndf))

      do i = 1,nnz
          K(u(i),v(i)) = K(u(i),v(i)) + a(i)
      enddo



38

帖子

3

主题

0

精华

熟手

F 币
156 元
贡献
77 点
发表于 2022-7-27 11:06:23 | 显示全部楼层
jiangweiwu 发表于 2022-7-26 17:00
首先谢谢你的代码。不过不是两个稀疏矩阵相加。是有u,v,a三个一维数组,只不过这其中的u,v有相同值得 ...

算的是刚度矩阵对吧。从我的角度来看,你的问题不出在稀疏矩阵和Fortran,你的有限元理论没弄清楚。你先弄局部刚度矩阵如何assemble到全局刚度矩阵,你的问题就有答案了。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2022-8-17 18:10

Powered by Tencent X3.4

© 2013-2022 Tencent

快速回复 返回顶部 返回列表