Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matrix 如何从矩阵中删除多个列_Matrix_Fortran - Fatal编程技术网

Matrix 如何从矩阵中删除多个列

Matrix 如何从矩阵中删除多个列,matrix,fortran,Matrix,Fortran,我想从矩阵AA1中删除第97列和第113列,然后该矩阵变成AA2。我只是想知道Fortran的任何命令是否可以实现这个操作?我家里没有Fortran编译器,所以我无法测试它。但我会做一些事情: 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 (ier

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

我家里没有Fortran编译器,所以我无法测试它。但我会做一些事情:

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
CYCLE
命令意味着不应再执行循环的其余部分,而应开始下一次迭代。因此,
i
不会增加,因此当
j=96
时,则
i=96
,当
j=98
时,则
i=97
,当
j=114
时,则
i=112

还有几句话:由于Fortran的内存布局,您希望以最快的速度循环第一个索引,以此类推。因此,如果将代码更改为:

i = 0
DO j = 1, 3*NBE
    IF (j == 97 .OR. j == 113) CYCLE
    i = i + 1
    AA2(:, i) = AA1(:, j)
END DO

(当然,使用just
AA1(:,:)=1
的just
AA1=1
,可以更轻松地完成这样一个简单的初始化:

Do j=1,3*NBE    ! Outer loop over second index
  Do i=1,3*NBE  ! Inner loop over first index
    AA1(i,j)=1
  End Do
End Do
说明:

  • (内部)为索引构建临时数组
    [1,…,96,98,…,112114,…,3*NBE]

  • (外部)复制矩阵,只考虑索引数组

    中的列
    好的,我同意@IanBush…更简单的是做三个专门的任务:

    AA2 = AA1(:,[(i,i=1,96),(i=98,112),(i=114,3*NBE)])
    
    给出了使用向量下标选择要包含的数组元素的概念。该答案使用

    AA2(:,1:96)   = AA1(:,1:96)
    AA2(:,97:111) = AA1(:,98:112)
    AA2(:,112:)   = AA1(:,114:)
    
    有些人可能会考虑

    [(i,i=1,96),(i=98,112),(i=114,3*NBE)]
    
    阅读时不够清晰。可以使用“临时”索引向量

    AA2 = AA1(:,[(i,i=1,96),(i=98,112),(i=114,3*NBE)])
    
    但这并不能解决数组构造函数不好的问题,尤其是在更复杂的情况下。相反,我们可以创建一个掩码并使用我们的常用技术:

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

    简单!?我肯定会写3行,每个“chunk”对应一行@IanBush Mhm,好吧……尽管我更喜欢让我的代码尽可能简洁。我更新了我的答案以反映你的建议。答案很好。但是,我在PACK命令中发现了一个错误。应该是PACK([(I,I=1,3*NBE)],column\u)。谢谢,我混淆了哪个数组的大小。前面的答案中还有一个错误。现在更正(我希望)。
    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)