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的任何命令是否可以实现此操作?
这是一个简单的一个班轮:
AA2 = AA1(:,[(i,i=1,96),(i=98,112),(i=114,3*NBE)])
Run Code Online (Sandbox Code Playgroud)
说明:
(内部部分)构造索引的临时数组 [1,...,96,98,...,112,114,...,3*NBE]
(外部)复制矩阵并仅考虑索引数组中的列
好的,我屈服于@IanBush ......更简单的是做三个专门的任务:
AA2(:,1:96) = AA1(:,1:96)
AA2(:,97:111) = AA1(:,98:112)
AA2(:,112:) = AA1(:,114:)
Run Code Online (Sandbox Code Playgroud)
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)