1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Ajuda Matlab/Octave

Discussão em 'Programação' iniciada por EMIReg, 16 de Novembro de 2008. (Respostas: 10; Visualizações: 2103)

  1. Boa tarde. Eu tenho de fazer um programa para ler informações de um ficheiro de texto e depois tratar os dados que nele se encontram e escrever num ficheiro os resultados da análise de dados. Eu fiz um programa em Matlab que funciona correctamente, mas como só o poderei implementar com Octave devido aos problemas das licenças, tentei rodá-lo em Octave. O problema é que as funções de escrita e leitura de ficheiros do Octave não são todas as do Matlab. Eu estou a usar o strread com o Matlab mas o Octave não a reconhece. Pensei em usar o fscanf e o sscanf mas não estou a conseguir pôr o programa a dar.

    Em Matlab funciona correctamente, já testei num computador com Matlab.

    Deixo em baixo o código de uma das funções do programa, que funciona correctamente em Matlab. Qualquer ajuda é bem vinda. Obrigado:

    Código:
    function [media,desviopadrao] = mediadesvio()
    %a função vai devolver um vector de duas entradas. A 1ª guarda o valor
    %médio observado nos ultimos 5 minutos (valor que pode ser alterado). 
    %A 2ª entrada guarda o desvio padrão correspondente.
    %Chamar na forma [media,desviopadrao]=mediadesvio
     
    periodo_de_avaliacao = 5 * 60; %5 minutos
    i=1; tempo_de_vida = []; %Vai guardar o tempo de vida do muão e o instante em que foi detectado (considerando t=0 o inicio da run).
    ficheiro = fopen('temp.txt','r'); %ATENÇÃO: Não esquecer de mudar o nome do ficheiro
    val=fgets(ficheiro);
     
    while (val ~= -1 & i<=29) %para saltar as 29 linhas que são de texto (informações sobre a run), não interessam
    [lixo] = strread(val,'%c');
    val = fgets(ficheiro);
    i = i+1;
    end
    i = 1;
    while val ~= -1 %para ler ate ao ultimo registo
    [tempo_de_vida(i,1), tempo_de_vida(i,1), tempo_de_vida(i,1), tempo_de_vida(i,2)] = strread(val,'%f %f %f %f'); %os dois primeiros valores devolvidos pela função "strread" em cada iteração não interessam, pois correspondem ao número de medição e a outro valor sem significado. Só o 3º valor é que nos interessa, que é o tempo de vida do muão, e ele é o que fica guardado em tempo_de_vida(i,1) em cada iteração. 
    val = fgets(ficheiro); %ler o enter e assim passar para a proxima linha
    i = i+1;
    end
     
     
    fclose(ficheiro);
     
     
    [noparse]while ( tempo_de_vida(end,2) - tempo_de_vida(1,2) > periodo_de_avaliacao)
    tempo_de_vida(1,:) = [];
    end %fim do while[/noparse]
     
    media = mean( tempo_de_vida(:,1) );
    desviopadrao = std( tempo_de_vida(:,1) );
     
    return
     
    %as primeiras 29 linhas são de texto, não interessam.
    
     
    Última edição pelo moderador: 16 de Novembro de 2008
  2. AwakE

    AwakE Banido

    A velha questão do Octave/Matlab. O que te aconselho, se só podes entregar o trabalho em Octave é nem tocares no Matlab. Vai custar ao inicio porque o Matlab tem as funções todas, mas o tempo que a seguir perdes na conversão não compensa...
     
  3. pois, ja percebi isso.. Pensei que o Octave tinha todas as funções básicas de leitura e escrita e que só lhe faltavam pacotes de estatistica, etc, que o Matlab tem, mas pelos vistos não é so isso,

    De qualquer forma, como achas que eu poderia substitur o strread? a opçao mais direkta seria pelo sscanf axu eu, mas nao estou a knseguir faze-lo funcionar...

    Alem disso, ouvi dizer que o scilab tem varias opçoes k faltam ao octave.. sabes se ele tem o strread?

    obrigado pelo concelho
     
  4. tiagopestana

    tiagopestana Power Member

    Quais sao exactamente os problemas que estás a ter com o sscanf? Eu nunca usei o Octave, mas sscanf é o que costumo usar em MATLAB.
     
  5. Eu não estava a conseguir usar o sscanf porque não o estava a chamar bem. Agora consigo usa-lo, mas só numa parte do programa, naquela em que o chamo para me devolver apenas um float (na rotina em cima é onde eu chamava o sscanf para me devolver um caracter) mas quando eu peço para me devolver mais do que um float ele dá erro. O problema é que eu não sei se o erro é do sscanf ou da matriz., mas eu já revi varias vezes e acho que estou a chamar correctamente a matriz pelos seus elementos...
     
  6. tiagopestana

    tiagopestana Power Member

    Deixa-me ver a chamada ao sscanf e uma das linhas que estás a ler.
     
  7. Obrgado pela disponibilidade. Já consegui resolver esse problema, era a matriz. Agora estou com um problema com o fprintf julgo eu. o código é:

    [media5,desviopadrao5]=mediadesvio %media e desvio padrao dos ultimos 5 minutos

    ficheiro = fopen('mediadesvio.txt','r')
    val=fgets(ficheiro)
    [mediadesvpadr(1,:)] = sscanf(val,'%f')

    mediadesvpadr(1)=media5
    mediadesvpadr(2)=desviopadrao5

    fclose(ficheiro)
    ficheiro = fopen('mediadesvio.txt','w')
    fprintf(ficheiro,"%f\t%f\t%f\t%f\t%f\t%f", mediadesvpadr(1),mediadesvpadr(2),mediadesvpadr(3),mediadesvpadr(4),mediadesvpadr(5),mediadesvpadr(6))
    fclose(ficheiro)




    e o ficheiro mediadesvio tem "1.02 2.11 2.261825 1.505516 4.223 1.375302"

    coloquei sem ponto e virgula para tentar perceber qual o erro. todos retornam algo, excepto o fprintf (que deveria retornar zero se corresse bem).

    o mais estranho é que se eu apagar o ficheiro mediadesvio e depois puser a correr o programa ele arranja os valores exactamente iguais. se eu alterar o ficheiro ele continua a ir buscar os valores anteriores. ja reiniciei o programa, ja confirmei e estou mesmo na pasta onde esta o fichiero...

    mais uma vez obrigado
     
  8. tiagopestana

    tiagopestana Power Member

    Experimenta mudar

    para

    Repara na diferença entre ' e ". O último \n pode ou nao ser necessário, dependendo do número de linhas que estás a escrever.
     
  9. era so uma linha, pelo que o \n não tinha importância, de qualquer forma testei com ' em vez de " mas não deu resultado, o octave lê os valores não sei onde (porque eu apago o ficheiro de texto e ele continua a ler, eu altero-o mas ele so le os anteriores...) e depois escreve-os nesse sitio qualquer, julgo que dentro da memoria virtual do proprio programa.

    Já agora, qual é a diferença entre ' e "? tinha a ideia de que a primeira é o separador da string no octave e o 2º no C, mas pensava que o octave lia as duas (não me devo ter explicado muito bem :))

    mais alguma sugestão?
     
  10. teho a certeza que o octave esta a usar a directoria onde está guardado o ficheiro de texto que ele não altera e que não o está a guardar em mais lado nenhum da memoria do computador, porque ja procurei. É possivel que ele esteja a guardar na memoria RAM?

    obrigado
     
  11. Wilsu

    Wilsu Power Member

    Bem, nunca usei o Octave por isso posso tar a dizer grande asneira pois n sei q funções ele tem.

    Anyway, experimenta usar a função sprintf(se existir) em vez da fprintf
     
    Última edição: 18 de Novembro de 2008

Partilhar esta Página