声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3818|回复: 7

[Fortran] Fortran中快速删除某行某列元素的方法

[复制链接]
发表于 2007-5-28 20:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x


  1. fortran中的数组,如果快速删除某行和某列的所有元素,例如N*N的数组,删除其中的第i
  2. 行,第i列,第j行,第j列的所有元素,形成一个(N-2)*(N-2)的数组(i,j可为1,N之间的
  3. 任何一个数值)。
  4. 不知道有没有什么方便快速的方法或命令?多谢了。

复制代码


下面是在水木社区上得到的一个很好的方法:


发信人: Konzern (拜坛祭风), 信区: NumComp
标  题: Re: 请教Fortran中快速删除某行某列元素的方法
发信站: 水木社区 (Mon May 28 10:57:38 2007), 站内
假定a(N,N)是allocatable的,定义一个logical的变量b(N,N)以及一个矢量c((N-2)*(N-2))
  1. b = .true.
  2. b(i,:) = .false.
  3. b(j,:) = .false.
  4. b(:,i) = .false.
  5. b(:,j) = .false.
  6. !
  7. c = pack(a, b, c)
  8. !
  9. deallocate( a)
  10. allocate( a(N-2, N-2) )
  11. !
  12. a = reshape(c, (/N-2,N-2/))
  13. !
复制代码

这样应该可以完成你想要的效果;已上是Fortran90的语句。
如果你另外定义一个变量d,那就不用deallocate和allocate a了,直接d=reshape(c,
(/N-2...
回复
分享到:

使用道具 举报

 楼主| 发表于 2007-5-28 20:56 | 显示全部楼层

回复 #1 心灯 的帖子

哦,对了,下午也琢磨出来一种方法,补上:
real *8 :: A(N,N),  C(N-2,N-2)  
integer :: A_numline(N-2)  

A_numline= (/1:i-1, i+1:j-1,j+1:N-2/)   !即把i,j给剔除,剩下的行或列的编号
C = A(A_numline,A_numline)

deallocate( a)
allocate( A(N-2, N-2) )
A=C


A即为所求.

[ 本帖最后由 心灯 于 2007-5-28 20:58 编辑 ]

评分

1

查看全部评分

发表于 2007-5-29 09:25 | 显示全部楼层
感觉两种办法都存在一个问题,就是需要形成额外的矩阵变量,比较占用空间,尤其是对大型的矩阵
 楼主| 发表于 2007-5-29 12:38 | 显示全部楼层

回复 #3 风花雪月 的帖子

没办法,呵呵,实际上C可以做成动态数组,用完之后就把所占的内存空间释放掉。转换过程中如果占用大量空间,恐怕是不好处理的。

如果用matlab的话,用 A([i j],:)=[] 就可以把i和j行删除,并缩小维数了,但是fortran里没有这样的操作,只好自己迂回实现了。

//附加说明:上面的代码不是我直接调试的代码,而是我抽取出来的,可能有些小问题没有注意到,例如 A应该定义为动态数组,还请各位注意。这里主要是给出可行的思路,供参考讨论。

[ 本帖最后由 心灯 于 2007-5-29 12:41 编辑 ]
发表于 2007-5-30 16:44 | 显示全部楼层
可已考虑移位的方法
 楼主| 发表于 2007-5-30 19:29 | 显示全部楼层

回复 #5 风花雪月 的帖子

采用移位的方法,如果要将A的维数缩小的话,同样要先保存到临时数组C中,然后对A重新分配空间,再将C返回给A的。

[ 本帖最后由 心灯 于 2007-5-30 19:30 编辑 ]
发表于 2007-5-31 09:14 | 显示全部楼层


为什么要缩小A?又不影响什么
 楼主| 发表于 2007-5-31 20:51 | 显示全部楼层

回复 #7 风花雪月 的帖子

Fortran 编程,划线法求解刚性支承下的 临界转速和响应,在弹性支承的程序基础上进行的修改。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-27 09:22 , Processed in 0.061316 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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