Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Fortran > [General] Fortran -> MatLab


Автор: Inekey 12.4.2010, 12:42
Преподаватель дал задание перевести программу из Fortran'a в MatLab, но я ничерта не шарю в программировании. Могли бы вы проверить то, что я сделал и если где-нибудь есть ошибки, то помочь от них избавиться? Всю программу скидывать конечно не буду, потому что она огромная, а скину часть, которая у меня вызывает наибольшее сомнение.
Фортрановский вариант части программы лежит в прикреплённом файле (там 3 файла jpeg).
А вот это то, что у меня получилось после перевода этой же части программы в матлаб:

function [a]=asg4c(a,n,m,fsl,ir)
% complex a,am,r
% integer n,m,ir,l,i,j,k,nm,nx,ls,kn,ke,kl,ks
% integer n1,n2,n3,nj,nk,na,nz
% real r1,r2,cabs
% dimension a(1),ir(n) 
% ir = zeros(1,n);
nm=n+m;
if (m-n)
    l=nm^2/4+nm;
    ke=0;
else 
    l=n*(m+2)-1;
end
ls=0;
ks=ke;
kn=ks+1;
kl=(l-ke*(nm-ke))/nm;
nx=ls+1;
ke=ks+kl; 
if (n-ke)
    ke=n;
    kl=n-ks;
end
nz = nm-ks;
for k=kn:ke
    a(nx)=fsl(a(nx),n,m,k);
    if (ks~=0)
        nx=nx+nm;
    else
        n1=nx;
        n2=n-1;
        for i=1:ks
            j=ir(i); 
            nj=n2+j; 
            r=a(n1);  
            a(n1)=a(nj);
            a(nj)=r;  
            n1=n1+1;
        end
    end
        nk=n2+nm; 
        na=0;
        n3=n1-1; 
        for i=nx:n3
        r=a(i); 
            for  j=n1:nk 
            na=na+1;
            a(j)=a(j)-r*a(na);
            end
        end
end
n2=ls;
for k=kn:ke
    nx=n2+k;
    n3=n2+nm;
    r1=0.;
    nk=k;
    for nj=k:n
        r2=abs(a(nx));
        nx=nx+1;
        if (r1<r2)
            continue
        else
            r1=r2;
            nk=nj;
        end
    end
    ir(k)=nk;
    nj=n2+nk;
    am=1./a(nj);
    nx=n2+k;
    for na=nx:n3
        a(na)=am*a(na);
    end
    if (ks~=0)
        n1=ls+k;
    else
        n1=k-ks;
        na=nk-ks;
        i=(ks-1)*nz+n1;
        for j=n1:i:nz
            r=a(j);
            a(j)=a(na);
            a(na)=r;
            na=na+nz;
        end
    end
    na=ls+nk ;
    i=(kl-1)*nm+n1;
    for j=n1:i:nm
        r=a(j);
        a(j)=a(na);
        a(na)=r;
        na=na+nm;
    end
    n1=nx+1;
    if (ks~=0)
        nj=ls+k;
    else
        nj=k-ks;
        i=(ks-1)*nz+nj;
        for j=nj:i:nz
            r=a(j);
            na=j;
            for nk=n1:n3
                na=na+1;
                a(na)=a(na)-r*a(nk);
            end
        end
    end
    i=(kl-1)*nm+nj;
    for j=nj:i:nm
        if (j~=nx)
            continue
        else
            r=a(j);
            na=j;
            for nk=n1:n3
                na=na+1;    
                a(na)=a(na)-r*a(nk);
            end
        end
    end
n2=n2+nm;
end
n3=nm-ke;
n1=(ks-1)*n3+1;
if (ks~=0)
    n2=n1+kl*n3;
else
    nj=kl+1;
    nk=n3;
    for k=1:n1:n3
        n2=nj;
        for i=k:nk
            a(i)=a(n2);
            n2=n2+1;
        end
        nk=nk+n3;
        nj=nj+nz;
    end
end
n1=n1+n3;
nj=ls+ke+1;
nk=n1+n3-1;
for k=n1:n2:n3
    na=nj;
    for i=k:nk
        a(i)=a(na);
        na=na+1;
    end
    nk=nk+n3;
    nj=nj+nm;
end
ls=ke*n3;
if(ke==n)
    ks=ke;
else
    if (n~=1)
        return
    else
        n1=n-1;
        n3=n1*m;
        n2=n3-m+1;
        for k=1:n1
            kl=n-k;
            j=ir(kl);
            nj=(j-1)*m;
            for i=n2:n3
                nj=nj+1;
                r=a(i);
                a(i)=a(nj);
                a(nj)=r;
            end
            n3=n2-1;
            n2=n2-m;
        end
    end
end
end

Автор: chernyshov 13.4.2010, 14:31
Если бы пояснения написали,например, что эта программа выполняет, то  было бы попроще разобраться. Или переменные по очевидней называли быsmile
вроде так правильно...переменные только непонятно как объявляете.
главное на матрицу на матрицу правильно умножать, но у вас такого нету вроде.
еще можн find добавить вместо if, и циклов убрать. А так в матлаб вставьте да посмотрите что будет smile

Автор: Inekey 13.4.2010, 19:54
Спасибо!!! Я попросил у вас помощи, потому что не был уверен в правильности переносов с учётом всх этих фортрановских меток.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)