【问题标题】:Extract the minor matrix from a 3x3 based on input i,j根据输入 i,j 从 3x3 中提取次要矩阵
【发布时间】:2019-01-17 15:38:31
【问题描述】:

对于给定的 3x3 矩阵,例如: A = [3 1 -4; 2 5 6 ; 1 4 8]

如果我需要次要矩阵来输入 (1,2) 次要 = [2 6 ; 1 8]

我已经编写了一个程序来从文本文件中读取矩阵,并且我应该编写一个子程序来根据用户对 i,j 的输入从主矩阵 A 中提取次要矩阵。我对 Fortran 很陌生,不知道该怎么做。我做了一些非常绝望的尝试,但我相信有一种更清洁的方法可以做到这一点。

我非常绝望,我为 i 和 j 的每种可能组合写了 9 个 if 函数,但这显然不是一个聪明的方法。任何帮助表示赞赏!

【问题讨论】:

  • 欢迎提供详细信息。阅读How to AskMinimal, Complete, and Verifiable example
  • 在您的示例中,minor(1,2)a([2,3],[1,3])(或 a(2:3,1:3:2),但此表达式可能不太有用)。现在在您最喜欢的教程中阅读有关 Fortran 的 向量下标数组部分,甚至在 SO 上搜索 Qs 和 As。
  • 你说得对,阿尔伯特,我读了“如何提问”,现在意识到我的帖子并不理想。在这里对不起新手:)

标签: fortran matrix-multiplication


【解决方案1】:

您可以使用 ac-implied-doRESHAPE 构建要保留的矩阵部分的掩码,然后使用 pack 删除其余部分并使用 @ 重新组合987654323@.

program minor
   implicit none
   integer A(3,3)
   integer, allocatable :: B(:,:)
   character(20) fmt
   integer i, j
   A = reshape([ &
       3,  1, -4, &
       2,  5,  6, &
       1,  4,  8], &
      shape(A), order = [2,1])
   write(fmt,'(*(g0))') '(a/',size(A,2),'(i3))'
   write(*,fmt) 'A =',transpose(A)
   B = reshape(pack(A,reshape([((all([i,j]/=[1,2]),i=1,size(A,1)), &
      j=1,size(A,2))],shape(A))),shape(A)-1)
   write(fmt,'(*(g0))') '(a/',size(B,2),'(i3))'
   write(*,fmt) 'B =',transpose(B)
end program minor

输出:

A =
  3  1 -4
  2  5  6
  1  4  8
B =
  2  6
  1  8

【讨论】:

    【解决方案2】:

    正如@HighPerformanceMark 在评论中所说,一种方法是使用矢量下标。您可以声明一个包含要保留的行和列相同的数组,并将它们作为索引传递给矩阵。像这样:

    function minor(matrix, i, j)
      integer, intent(in) :: matrix(:,:), i, j
      integer :: minor(size(matrix, 1) - 1, size(matrix, 2) - 1)
      integer :: rows(size(matrix, 1) - 1), cols(size(matrix, 2) - 1), k
    
      rows = [(k, k = 1, i - 1), (k, k = i + 1, size(rows))]
      cols = [(k, k = 1, j - 1), (k, k = j + 1, size(cols))]
      minor = matrix(rows, cols)
    end
    

    (我还没有测试,如果有错误请告诉我)

    另一种选择是从 4 个分配中构造一个新矩阵,一个用于结果的每个象限(受排除的行/列的限制)。

    我更喜欢第一个选项,因为它更具可扩展性。您可以通过将数组作为参数传递来轻松扩展该函数以删除多行/多列,或者将其调整为在更高维度上工作。

    【讨论】:

    • 太棒了,我无法正确编译您的特定函数,但这可能是由于我的经验不足。然而这个概念很好用,我创建了一个创建行和列的子例程(无法获得返回矩阵的函数,将在今天晚些时候进行研究)
    猜你喜欢
    • 2023-03-15
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多