Как определить размеры нескольких матриц в текстовом файле - PullRequest
0 голосов
/ 10 октября 2018

Я хочу знать размеры нескольких матриц, которые я читаю из файла.Я сделал код для вычисления количества строк и общего количества элементов матрицы и знаю, таким образом, количество столбцов, деля общее количество элементов на количество строк.

program matrix
    implicit none

    integer,dimension(:),allocatable::total
    integer row,io,countRows,columns,m,numElements

    open(12,file='matrix.txt',status='old',iostat=io)
    if (io.ne.0) then
        write(*,*)'error to open file'
        stop
    end if

    !count rows
    countRows=0
    io=0
    do while (io.ge.0)
        read(12,*,iostat=io) row
        if (io.eq.0) countRows=countRows+1
    end do
    rewind(12)

    !total of elements
    io=0
    do m=1,1000
        allocate(total(m))
        read(12,*,iostat=io) total
        deallocate(total)
        rewind(12)
        if (io.ne.0) exit
    end do

    numElements=size(total)-1
    columns=numElements/countRows

    close(12)
end program

Проблема в том, что он работает только тогда, когда в файле есть матрица, потому что если их несколько, разделенных одной или несколькими пустыми строками, он сообщает мне общее количество строк и общее количество элементов файла.Мне нужно знать, как разделить эти матрицы для независимого подсчета их строк и столбцов.

Пример файла может выглядеть как

90 21 11 13
12 11 10 11
33 44 76 55

12 12
87 99

33 12 17
45 98 77

1 Ответ

0 голосов
/ 10 октября 2018

Я могу предложить решение, подобное этому, не причудливое, но, кажется, работает с примером:

program matrix
    implicit none

    integer,dimension(:),allocatable::total
    integer row,io,countRows,columns,m,numElements,icol
    integer mlocs(100,2),imat,countMat,countSpace,nmats
    character(len=256) line
    character linechar

    mlocs=0;
    open(12,file='matrix.txt',status='old',iostat=io)
    if (io.ne.0) then
        write(*,*)'error to open file'
        stop
    end if

    !count rows
    countRows=0
    countMat=1;countSpace=0;

    do while (1.gt.0.0)
        read(12,'(a)',end=100) line
        print*,trim(line)
        countRows=countRows+1;countSpace=1;
        if (len(trim(line)).eq.0) then
            countMat=countMat+1;mlocs(countMat,1)=countRows;
        elseif (len(trim(line)).gt.0) then
            do icol=1,len(trim(line))
                read(line(icol:icol),'(a)') linechar
                if (linechar.eq.' ') then 
                  countSpace=countSpace+1;
                  mlocs(countMat,2)=countSpace
                endif
            enddo
        endif
    end do
100 print*,'Number of lines is ',countRows
    print*,'Number of matrices is ',countMat
    nmats=countMat;

    do imat=1,nmats
       print*,'NUmber of elements in matrix ',imat,' is ',mlocs(imat,2:2)
    enddo

    close(12)
end program
...