Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Fortran]Матрицы, 5-ти диаг. матрица, умнажение на вектор. 
:(
    Опции темы
KJIaCCuK
Дата 24.5.2008, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 11.5.2006
Где: Новосибирск

Репутация: нет
Всего: нет



Суть такая: 5-ти диаг. матрица умнажается на вектор. Все читается из файла, и результат записываются тоже в файл.
Есть программа. Большая просьба написать к ней комменты!!

Код


    program Lab3
    common /Par/ A(100), n, vek, m,irez,idiag ,mdg
    
    iRZ=100

    call VVOD(A(1),iRZ,n,m,mdg,idiag,ivek,iERROR)
    
    write(*,*) 'ERROR  ', ierror
    
    if (iERROR==1) then
    write (*,*) 'KRIVOI FAIL'
    goto 99
    end if
    write(*,*) '-->>',ivek
    call UMN(A(1), A(ivek), A(ivek+n), n, m, mdg, idiag)

99    end program Lab3

!*****************************************************************!
!Подпрограмма ввода!
    subroutine VVOD(A,iRZ,n,m,mdg,idiag,ivek,iERROR)
    real A
    dimension A(iRZ)
    
    iERROR=0

    open(unit=1, file='1.txt',access='direct', recl=1)
    read(1,rec=1) n
    read(1,rec=2) m
    read(1,rec=3) mdg

    write(*,*) n,m,mdg

    idiag=5 !кол-во второстепеных диагоналдей

!********!ПРОВЕРКА ИСХ. ДАННЫХ!*******!
!кол-во элементов масива нужного для хранения матр., результата и др...
    iVT=idiag-mdg !кол-во элементов верхнем / нижнем треугольниках
    iNT=mdg - 1
    
    write(*,*) ivt,int
    imes=(idiag)*n+n+n 
    write(*,*) 'RAZMER ',imes
    
    !элементы треугольников не входят вразмерность матрици
    if (((iVT*m+1)>n).OR.((iNT*m+1)>n)) goto 10 
    !слишком много эл-тов., слишком маленькая матрица, отриц. положение гл. диаг.
    if ( (mdg<=0).OR.(imes>iRZ).OR.(n<(idiag+(m-1)*2)) ) then
10      print *, 'MY-XA-XA-XA-XA-XA-XA'
      iERROR=1
      close(1)
      goto 99
    endif

!******чтение исх. даных******!    

    j=1
    do 1, j=1, n*5
1    read(1,rec=j+3) A(j)
    write(*,*) A(1:n*5)
    close(1)

    
    !i=i+1
    i=n*5+1
    ivek=i
    open(unit=1, file='V.txt',access='direct', recl=1)

    i2=1
    do 11 i=ivek, ivek+n-1
    read(1,rec=i2) A(i)
11    i2=i2+1

    close(1)
    write(*,*)
    write(*,*) A(ivek:ivek+n-1)

99    end subroutine VVOD

!*****************************************************************!
!Подпрограмма умножения на вектор!
    subroutine UMN(M, V, R, n, m1, mdg, idiag)
    real M, V, R
    dimension M(idiag, n), V(n), R(n)

    ism=-1
    j=1
    
    nmax=n-1-((m1+1)*(mdg-1))
    nmax=n-nmax

    nmax2=n-1-((m1+1)*(idiag-mdg))
    nmax2=n-nmax2

    write(*,*) 'NMAX-VT', nmax
    write(*,*) 'NMAX-NT', nmax2

    do 1 j=1, n
    
    R(j)=0
    i=1
    i2=1

    ism=ism+1

    if ((ism>m1).AND.(j<=nmax)) ism=0

    do 1 ,i=1 ,idiag

    if ( (.NOT.((i2+ism)>n)).AND.(i2<=(nmax2+j-1)) ) then  !!!

     if (j<=((mdg-i)*(m1+1))) then
     i2=1
     else
     R(j)=R(j)+M(i,j)*V(i2+ism) 

     i2=i2+1+m1
     end if
1    end if
    
99    write(*,*) 'REZULT'
    write(*,*) R(1:n)

    open(unit=1, file='R6.txt')
    WRITE(1,10) R(1:n)
    close(1)

10    format(F)

    
    end subroutine UMN




PM MAIL ICQ   Вверх
popovda
Дата 24.5.2008, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 290
Регистрация: 9.6.2006
Где: Москва

Репутация: нет
Всего: 6



Какой компилятор фортрана используется? Если Compaq Visual Fortran или Intel, или Absoft, или другие компиляторы стандартов языка 90/95, то не надо изобретать велосипед:


C = matmul(A,B) ! Умножение матриц. 

А так - вполне приличный код. Но можно и нужно обойтись без меток. Ваш алгоритм это позволяет сделать.


--------------------
С уважением, Попов Д.А.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0612 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.