【问题标题】:Separating a matrix into sub-matrices in Fortran在 Fortran 中将矩阵分离为子矩阵
【发布时间】:2023-03-15 10:56:01
【问题描述】:

假设我有一个二维数组,第一列仅由两个整数 1 和 2 组成:

1 5 1 7 0.5                   
2 4 5 6 0.1       
1 9 3 4 0.6        
2 8 7 2 0.2  

我想从中分离出两个矩阵,这样每个矩阵的第一列都包含相同的整数(因此第一个矩阵的第一列只包含整数 1,第二个矩阵中的 2 也是如此)。
所以它会变成:

1 5 1 7 0.5
1 9 3 4 0.6  

2 4 5 6 0.1              
2 8 7 2 0.2 

我不知道如何开始。我正在考虑在开始时使用计数(嗯,因为我有一个更大的矩阵,第一列中有 10 个不同的整数),然后根据每个整数的计数,我构造每个 [子] 矩阵的维度。之后,我唯一能想到的就是计数(掩码),如果该值为真,则通过 if 语句将其添加到矩阵中。

【问题讨论】:

  • 您能否更清楚地了解您想要实现的目标?另外,您能否发布您已经尝试过的任何代码以及您得到的结果?
  • 我只能想到用两个循环来做这件事。一个来计算每个数组的大小,另一个来分配值。
  • 其实我认为有一个内在的功能,但我仍然不确定OP在寻找什么
  • 不清楚您对矩阵的含义:您是指程序中的 Fortran 数组(您想在程序中从一个已经存在于内存中的数组创建多个数组),还是数字的规则排列在文件中(您有一个输入文件并想创建多个输出文件)?您提供的示例有整数和实数,如果您正在考虑第一种情况,您是否要将它们存储在同一个数组中(它必须是实数),或者您可以将它们存储在两个数组中(一个用于整数,一个用于实数)?
  • 如果不清楚,请原谅。是的,我有一个输入文件,我想从中创建多个输出文件。并感谢通知他们是真实的。因为我想将它们存储在同一个数组中。

标签: arrays matrix fortran


【解决方案1】:

在 Fortran 的同一个数组中不能有混合类型(integerreal),所以我假设 2-dim 数组中的所有数据都是 real

program split
  implicit none

  real, allocatable :: a(:, :), b(:, :)
  integer :: i, ids = 10
  integer, allocatable :: id(:), seq(:)

  a = reshape([real :: 1, 5, 1, 7, 0.5, &
                     & 2, 4, 5, 6, 0.1, &
                     & 1, 9, 3, 4, 0.6, &
                     & 2, 8, 7, 2, 0.2], [5, 4])
  seq = [(i, i = 1, size(a, 2))]
  do i = 1, ids
    print*, "i = ", i
    ! here we are creating a vector with all the line indices that start with i
    ! e.g. for i = 1 we get id = [1, 3], for i = 2 we get [2, 4], for i = 3 we get [], ...
    id =  pack(seq, a(1,:) == i)
    ! here we use a Fortran feature named vector-subscript
    b = a(:, id)
    print*, b
  end do
end

如果您希望第一列(或任何列)为integer,您可以将其声明为一个单独的数组,并使用相同的向量下标来收集所需的行。

【讨论】:

  • 完美!非常感谢!
  • 我只有一个问题。我正在用 Fortran 90 编写代码。您的 2003 版本对我来说一切都很清楚,除了 seq = [i...],我不知道如何在 F90 中纠正它。
  • seq =(/(i, i = 1, size(a, 2))/) 但我在整个示例中使用了自动分配,这在 Fonrtran 90 中不存在。您可能必须在使用 allocate(seq(1:size(a, 2)) 之前分配数组 seq。所有其他可分配数组也是如此。
猜你喜欢
  • 2015-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-11
  • 1970-01-01
  • 1970-01-01
  • 2014-08-09
相关资源
最近更新 更多