心灯 发表于 2007-5-28 20:04

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



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



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


发信人: Konzern (拜坛祭风), 信区: NumComp
标题: Re: 请教Fortran中快速删除某行某列元素的方法
发信站: 水木社区 (Mon May 28 10:57:38 2007), 站内
假定a(N,N)是allocatable的,定义一个logical的变量b(N,N)以及一个矢量c((N-2)*(N-2))
b = .true.
b(i,:) = .false.
b(j,:) = .false.
b(:,i) = .false.
b(:,j) = .false.
!
c = pack(a, b, c)
!
deallocate( a)
allocate( a(N-2, N-2) )
!
a = reshape(c, (/N-2,N-2/))
!
这样应该可以完成你想要的效果;已上是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 编辑 ]

风花雪月 发表于 2007-5-29 09:25

感觉两种办法都存在一个问题,就是需要形成额外的矩阵变量,比较占用空间,尤其是对大型的矩阵

心灯 发表于 2007-5-29 12:38

回复 #3 风花雪月 的帖子

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

如果用matlab的话,用 A(,:)=[] 就可以把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

原帖由 心灯 于 2007-5-30 19:29 发表 http://www.chinavib.com/forum/images/common/back.gif
采用移位的方法,如果要将A的维数缩小的话,同样要先保存到临时数组C中,然后对A重新分配空间,再将C返回给A的。

为什么要缩小A?又不影响什么

心灯 发表于 2007-5-31 20:51

回复 #7 风花雪月 的帖子

Fortran 编程,划线法求解刚性支承下的 临界转速和响应,在弹性支承的程序基础上进行的修改。
页: [1]
查看完整版本: Fortran中快速删除某行某列元素的方法