如何从矩阵中删除多个列

Jer*_*amu 3 fortran matrix

Integer :: NBE,ierr,RN,i,j
Real(kind=8), allocatable :: AA1(:,:),AA2(:,:)

NBE=40 
RN=3*NBE-2
Allocate(AA1(3*NBE,3*NBE),AA2(3*NBE,RN),stat=ierr)

If (ierr .ne. 0) Then
    print *, 'allocate steps failed 1'
    pause
End If

Do i=1,3*NBE
  Do j=1,3*NBE
     AA1(i,j)=1
  End Do
End Do
Run Code Online (Sandbox Code Playgroud)

我想从矩阵中删除列97和113 AA1,然后这个矩阵变为AA2.我只想知道Fortran的任何命令是否可以实现此操作?

Ale*_*ogt 5

这是一个简单的一个班轮:

AA2 = AA1(:,[(i,i=1,96),(i=98,112),(i=114,3*NBE)])
Run Code Online (Sandbox Code Playgroud)

说明:

  1. (内部部分)构造索引的临时数组 [1,...,96,98,...,112,114,...,3*NBE]

  2. (外部)复制矩阵并仅考虑索引数组中的列


好的,我屈服于@IanBush ......更简单的是做三个专门的任务:

AA2(:,1:96)   = AA1(:,1:96)
AA2(:,97:111) = AA1(:,98:112)
AA2(:,112:)   = AA1(:,114:)
Run Code Online (Sandbox Code Playgroud)

  • 简单!?我肯定会把它写成3行,每个"块"一行 (2认同)

fra*_*lus 5

Alexander Vogt的回答给出了使用向量下标来选择要包含的数组元素的概念.该答案使用构造向量下标数组

[(i,i=1,96),(i=98,112),(i=114,3*NBE)]
Run Code Online (Sandbox Code Playgroud)

有人可能会考虑

AA2 = AA1(:,[(i,i=1,96),(i=98,112),(i=114,3*NBE)])
Run Code Online (Sandbox Code Playgroud)

在阅读中不太清楚.可以使用"临时"索引向量

integer selected_columns(RN)
selected_columns = [(i,i=1,96),(i=98,112),(i=114,3*NBE)]
AA2 = AA1(:,selected_columns)
Run Code Online (Sandbox Code Playgroud)

但这并没有解决数组构造函数不好的问题,尤其是在更复杂的情况下.相反,我们可以创建一个掩码并使用我们常用的技术:

logical column_wanted(3*NBE)
integer, allocatable :: selected_columns(:)

! Create a mask of whether a column is wanted
column_wanted = .TRUE.
column_wanted([97,113]) = .FALSE.

! Create a list of indexes of wanted columns
selected_columns = PACK([(i,i=1,3*NBE)],column_wanted)
AA2 = AA1(:,selected_columns)
Run Code Online (Sandbox Code Playgroud)