【发布时间】:2020-02-29 20:34:08
【问题描述】:
以下代码可以正常工作。我生成了一个 9x9 矩阵,它由 9 个单独的 3x3 子块矩阵组成。但是,很多代码似乎是重复的,而且我似乎使用了过多的 DO 循环。
有什么方法可以生成相同的 9x9 矩阵,但无需复制大量代码并最大限度地减少 do 循环的数量?
我的实际问题涉及一个比 9x9 矩阵大得多的方阵,所以这个 TestCode 不是那么通用或有用,尽管它可以工作。
此处矩阵为 9x9 的情况只是一个最小的、完整的、可验证的示例。一般来说,我需要对 n x n 矩阵执行此操作,其中每个子块的大小为 sqrt(n) x sqrt(n)。
PROGRAM TestCode
IMPLICIT NONE
INTEGER :: i, j, m!matrix indices (i,j)
INTEGER,PARAMETER :: n = 9 ! matrix is 9x9
DOUBLE PRECISION :: KE(n,n)
REAL :: nn
nn = n
m = SQRT(nn)
DO i = 1, m
DO j = 1, m
IF( i .EQ. j) THEN
KE(i,j) = -4
ELSEIF ( ABS(i-j) .EQ. 1) THEN
KE(i,j) = 1
ELSE
KE(i,j) = 0
END IF
END DO
END DO
DO i = 4,6
DO j = 4,6
IF( i .EQ. j) THEN
KE(i,j) = -4
ELSEIF ( ABS(i-j) .EQ. 1) THEN
KE(i,j) = 1
ELSE
KE(i,j) = 0
END IF
END DO
END DO
DO i = 7,9
DO j = 7,9
IF( i .EQ. j) THEN
KE(i,j) = -4
ELSEIF ( ABS(i-j) .EQ. 1) THEN
KE(i,j) = 1
ELSE
KE(i,j) = 0
END IF
END DO
END DO
DO i = 4,6
DO j = 1,m
IF( ABS(i-j) .EQ. m) THEN
KE(i,j) = 1
ELSE
KE(i,j) = 0
END IF
END DO
END DO
DO i = 7,9
DO j = 1,m
KE(i,j) = 0
END DO
END DO
DO i = 1,m
DO j = 4,6
IF ( ABS(i-j) .EQ. m) THEN
KE(i,j) = 1
ELSE
KE(i,j) = 0
END IF
END DO
END DO
DO i = 7,9
DO j = 4,6
IF ( ABS(i-j) .EQ. m) THEN
KE(i,j) = 1
ELSE
KE(i,j) = 0
END IF
END DO
END DO
DO i = 1,m
DO j = 7,9
KE(i,j) = 0
END DO
END DO
DO i = 4,6
DO j = 7,9
IF( ABS(i-j) .EQ. m) THEN
KE(i,j) = 1
ELSE
KE(i,j) = 0
END IF
END DO
END DO
END PROGRAM
【问题讨论】:
-
this other question 有帮助吗?
-
@francescalus 感谢您提出这个问题。我在发这个帖子之前就找到了那个帖子。我不完全确定你在使用数组构造函数的答案中做了什么,所以我不想只是复制代码,因为我根本不理解它。我理解我上面写的代码,所以我试图根据我自己理解的东西来简化它。如果您认为我的问题是重复的,我确实理解。但是,我使用 VladimirF 的答案而不是您的数组构造方法答案会更容易吗?
-
@francescalus 另外,这里的矩阵为 9x9 的情况只是一个最小的、完整的、可验证的示例。一般来说,我需要对 n x n 矩阵执行此操作,其中每个子块的大小为 sqrt(n) x sqrt(n)。所以我认为我的问题可能与您建议的帖子略有不同。虽然我可能只是错过了联系。谢谢
-
糟糕,我没有认出我的答案,所以我必须重新阅读问题/答案才能回答您的观点。 (不是重复的建议,因为我没有充分的时间去复习。)
-
你可以做的一件事就是切换索引,Fortran 是主要列。