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

[matlab] Criação de ciclo para novo vector

Discussão em 'Programação' iniciada por Helixsk8, 3 de Dezembro de 2008. (Respostas: 2; Visualizações: 722)

  1. Helixsk8

    Helixsk8 I quit My Job for Folding

    Boas pessoal
    Estou aqui preso num problema um bocado "chatinho" que me está a atrasar um projecto todo.
    A questão é a seguinte.

    Chego a um vector
    x(x1,x2,x3,x4....xn)

    A ideia seria substituir este vector com a seguinte configuração...

    x(x1,x2,x2,x3,x3,x4,x4,...,xn,xn) Já tive a tentar com ciclo o problema é que ao correr a primeira vez substitui logo a segunda posição de X sendo os resultados seguintes todos errados.

    Estava a tentar fazer isto sem vector auxiliar...

    Alguma ideia?

    Obrigado
     
  2. alakazan

    alakazan Power Member

    usa um vector auxiliar, isso não aumenta o tempo de computação.

    uma forma de fazer...
    Código:
    x1=[1,2,3,4,5];
    x=[1];
    a=2
    for i=2:2:(2*length(x1)-1)
        x(i)=x1(a);
        x(i+1)=x1(a);
        a=a+1;
    end
    x
    
    outra forma
    Código:
    x1=[1,2,3,4,5];
    x=[1];
    for i=1:(length(x1)-1)
        x(2*i)=x1(i+1);
        x(2*i+1)=x1(i+1);   
    end
    x
    
    E o resultado obtido de ambas a formas.
    Código:
    x = 1     2     2     3     3     4     4     5     5
    
    assim de repente sem vector auxiliar não tou a ver.



    edit: só um pequeno reparo, no codigo que meti antes, substitui o x=[1] por x=ones(1,2*length(x1)-1).
    A pre alocação aumenta a velocidade de computação dos ciclos no matlab.

    Por exemplo num vector x1 de 9000 elementos o tempo de computação sem pre alocação é de 2,5 segundos +/- e com prealocação é menos de 0.01 s.
     
    Última edição: 3 de Dezembro de 2008
  3. tiagopestana

    tiagopestana Power Member

    Experimenta uma coisa deste género:

    Código:
    A = [1 2 3 4 5 6 7 8 9];
    Ax = repmat(A,2,1);
    Ax = reshape(Ax,1,prod(size(Ax)));
    
    o resultado seria:

    Código:
    Ax = [1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9]
    Edit: Reparei agora que só queres o primeiro valor uma vez, para isso basta acrescentar a seguinte linha:

    Código:
    Ax = Ax(2:end);
    Edit #2: Este é um daqueles casos em que vectorizar o código nao ajuda. O meu método é mais lento do que o código do alakazan, especialmente para quantidades de dados mais pequenas. De qualquer modo, este tipo de "truques" com as funçoes repmat, reshape, bsxfun e permute podem poupar-te muito tempo em operaçoes que sejam consideravelmente mais complicadas.
     
    Última edição: 4 de Dezembro de 2008

Partilhar esta Página