Алгоритм для прогрессивной матрицы - PullRequest
0 голосов
/ 30 ноября 2018

Я хочу построить матрицу примерно так:

[ 0 1 2 3 4 5 ....
  1 2 3 4 5 6 ....
  2 3 4 5 6 7 ....
  3 4 5 6 7 8 ....
  4 5 6 7 8 9 ....
  5 6 7 8 9 10 ... ] etc 

Основная цель - использовать алгоритм для приведения в действие элементов уже существующей матрицы.

Япрограммирование на Фортране, и я использовал следующий код, но он не работает:

do i = 1, m+1
  do j = 1, m+1
    do while ( w < 2*m )
      if ( i > j ) then
        ma(i,j) = 0
      else 
        w = i-1
        ma(i, j) = w
        w = w +1 
      end if
    end do
  end do
end do

Ответы [ 4 ]

0 голосов
/ 02 декабря 2018

Спасибо за отзыв, мне удалось сделать это, используя следующий код:

do i = 1, m+1
  w = i-1
  do j = 1, m+1
    ma(i, j) = u**w
    w = w+1
  end do
end do

Я хотел бы заявить, что я использую Fortran 90 и только 90 из-за моих обстоятельств, в противном случае я быЯ работал с c ++, (университетская жизнь !!).

Обратите внимание, что я использовал желаемую серию для приведения в действие элементов матрицы.

Наконец, я заметил некоторые "сложные ответы, может быть, или, может быть, я просто новичок, но мне бы очень хотелось узнать, есть ли какие-то правила, или что нужно, а что нельзя, или совет, чтобы улучшить кодирование (научный код, а не код разработки).

Большое спасибо за обратную связь и ждем каких-либо ответов.

0 голосов
/ 30 ноября 2018

Хотя лично в ответе Родриго нет ничего плохого, я думаю, гораздо проще использовать две петли

ian@eris:~/work/stackoverflow$ cat floyd.f90
Program yes
  Implicit None
  Integer, Parameter :: n = 5
  Integer, Dimension( 1:n, 1:n )  :: elp
  Integer :: base, offset
  Integer :: i, j
  Do i = 1, n
     base = i - 1
     Do j = 1, n
        offset = j - 1
        elp( j, i ) = base + offset
     End Do
  End Do
  Do j = 1, n
     Write( *, '( 1000( i3, 1x ) )' ) elp( j, : )
  End Do
End Program yes
ian@eris:~/work/stackoverflow$ gfortran -Wall -Wextra -std=f2003 -fcheck=all -O floyd.f90 -o genesis
ian@eris:~/work/stackoverflow$ ./genesis 
  0   1   2   3   4
  1   2   3   4   5
  2   3   4   5   6
  3   4   5   6   7
  4   5   6   7   8
0 голосов
/ 30 ноября 2018

Я видел, что другие уже создали алгоритм, который решает вашу проблему.Но я также привожу другой алгоритм, который работает для неквадратной матрицы.NI - количество столбцов матрицы, а NJ - количество строк.MAT - это матрица, которую вы хотите.

PROGRAM MATRIX    
IMPLICIT NONE
    INTEGER                     ::  I, J, NI, NJ
    INTEGER, ALLOCATABLE        ::  MAT(:,:)

    NI = 8
    NJ = 5

    ALLOCATE(MAT(NI,NJ))

    DO I = 1, NI
        MAT(I,1) = I-1
    ENDDO

    DO J = 2,NJ
        MAT(:,J) = MAT(:,J-1) + 1 
    ENDDO

    DO J = 1, NJ
        WRITE(*,'(8I3)') MAT(:,J)
    ENDDO
END PROGRAM 
0 голосов
/ 30 ноября 2018

Я предлагаю вам использовать подразумеваемый do в синтаксисе конструктора массива, возможно, инициализированном в том же объявлении:

integer, parameter :: n = 10, m = 5
integer :: i, j
integer :: ma(m,n) = reshape([((i+j, j=0, m-1), i=0, n-1)], [m,n])

Синтаксис [...] возможен в Fortran 2003 или более поздней версии.(/.../) следует использовать иначе.Мой результат с gfortran v7.1.1:

do i = 1, m
  print *, ma(i, :)
end do

$gfortran test.f90 -o main
$main
           0           1           2           3           4           5           6           7           8           9
           1           2           3           4           5           6           7           8           9          10
           2           3           4           5           6           7           8           9          10          11
           3           4           5           6           7           8           9          10          11          12
           4           5           6           7           8           9          10          11          12          13

Примечание. Инициализация в объявлении возможна только в том случае, если n и m являются константами (parameter),Вы можете инициализировать его обычно в теле программы, в противном случае с тем же синтаксисом подразумеваемого выполнения.Если вы планируете читать значения m и n во время выполнения, вы должны сделать ma выделяемым массивом.

...