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

Matlab

Discussão em 'Programação' iniciada por MadalenaM, 6 de Novembro de 2006. (Respostas: 8; Visualizações: 970)

  1. Ola :)
    Queria pedir a vossa ajuda na resolução de um problema de MatLab. Percebo mt de programação e isto é mto importante para a minha avaliação.

    Problema C
    Defina em Matlab uma função que receba como argumento uma matriz quadrada de naturais, percorra a matriz recorrendo a dois ciclos while encaixados e retorne um vector de comprimento dois contendo:
    • na primeira posição, o produto dos elementos tais que não ocorre nenhum elemento maior que eles acima na mesma coluna;
    • na segunda posição, a soma dos elementos menores que o índice da coluna onde ocorrem.
    eu resolvi da seguinte maneira mas tem varios erros e a solução nao aparece certa no matlab. pensei tb em utilizar a função maximo na resolução mas nao sei como inseri-la no corpo do programa! agradecia mt a vossa ajuda. obrigada

    function v=h(A)
    [L,C]=size(A)
    M=0;
    J=1;
    while J<=C
    I=1;
    S=0;
    while I<=L
    if A(I,J)> A(I-1,J)
    M=M*A(I,J)
    end
    if A(I,J)<J
    S=S+A(I,J)
    end
    I=I+1;
    end
    J=J+1;
    end
    v=[S, M]
    end
     
  2. ajax

    ajax Banido

    M não pode ser inicializado a 0 porque é o elemento absorvente da multiplicação. O resultado final de M será sempre 0. O correcto é M=1

    Não podes atribuir zero a S dentro de um dos ciclos while. Deves retirar o S=0 para fora dos ciclos. Ele que fique coladinho ao M=1. De resto, numa leitura em diagonal parecem-me certo.

    O que se pretende como o produto dos elementos,bla,bla, não está muito claro. Nota negativa ao professor. :D
     
  3. tens razao ajax, obrigada :)
    qt ao restante parecer-te certo nao está e o matlab revela um erro em if A(I,J)> A(I-1,J), so q nao sei como corrigir de modo a q esteja d acordo c o enunciado!
    agradecia mt a vossa ajuda o mais depressa possivel :)
     
  4. trikton

    trikton Power Member

    function vec = probc(matrix)

    [nlin, ncol] = size(matrix)

    i=1;
    j=1;

    vec = [1 0];

    %inicialização do valor máximo de cada coluna, igual ao valor do 1º
    %elemento de cada coluna
    maxColunas = matrix(1,: )

    while(i<= nlin)


    while(j<= ncol)

    elem = matrix(i,j)

    %Se o elemento for maior do que o maximo da sua coluna
    if(elem > maxColunas(1,j))

    %Actualiza-se o máximo desta coluna
    maxColunas(1,j) = elem;

    vec(1) = vec(1)*elem;

    end


    %Se o elemento for menor que o indice da coluna
    if(elem < j)

    vec(2) = vec(2) + elem;

    end

    j=j+1;

    end

    i=i+1;
    j=1;
    end


    end


    Será isto? pode ter diferenças é no facto dos 1º's elementos de cada coluna não entrarem neste caso no resultado da posição 1 do vector de saida, mas é uma questão de interpretação do enunciado :p se for preciso, basta mudares a inicialização de vec.
     
  5. ajax

    ajax Banido

    O erro surge porque quando i=1 (a processar a 1 linha da matriz), I-1 = 0 e esta "linha" não existe na matriz. Este tipo de "problemas" são recorrentes. Podes optar por algo do tipo apresentado pelo trikton mas falta a condição de execução no primeiro "while" e inicializar o maxColunas ao primeiro elemento de cada coluna (isto é, a 1 linha) e substituir a condição do primeiro if para >=. Não vou aqui meter o código em matlab para a resolução do problema porque assim não aprenderiam com os erros. Descubram a razão das minhas sugestões e vamos lá ver quem apresenta a primeira função que realmente faz aquilo que se pede. É melhor interpretar o problema de forma a retornar o valor do produto de todos os elementos que sejam maiores que quaisquer outros elementos da mesma coluna mas de índice de linha inferior. Foi esta a interpretação do trikton.

    PS. acabo de descobrir que a condição de execução do 1 while está lá mas a "preto" sobre preto pelo menos no meu browser. :D Estava a achar estranho o esquecimento e fui verificar após uma leitura por alto.
     
    Última edição: 8 de Novembro de 2006
  6. obrigada trikton e ajax pela ajuda :)

    ...mas tenho outro problema p/ entregar ate segunda! ajudem-me por favor!

    Problema D

    Desenvolva em Matlab uma função que receba como argumento uma matriz quadrada de números naturais, percorra elemento a elemento a matriz dada recorrendo a dois ciclos while encaixados e retorne um vector (com tantas posições quantas as linhas da matriz) cuja posição k contém a soma do produto dos elementos ímpares da linha k que são iguais ao índice da coluna onde ocorrem com o número de elementos da coluna k que são diferentes do máximo dessa coluna. Nota: não pode utilizar a função max

    function V=problemaD(A)
    [L,C]=size(A);
    V=zeros(1,L);
    I=1;
    while I<=L
    J=1;
    M=-inf;
    Q=1;
    S=1;
    while J<=C
    if (A(I,J)>M)
    M=A(I,J);
    S=A(I,J);
    else if (mod (A(I,J))~=0) & A(I,J)=J)
    Q=Q*1;
    end
    if A(I,J)~=M
    S=S*A(I,J);
    end
    J=J+1;
    end
    V(I)=S+Q
    end
    end


    a resolução que fiz revela erro na linha else if (mod (A(I,J))~=0) & A(I,J)=J)
    nao sei como solucionar!!
    aceito todas as sugestoes. obrigada!!!!
     
  7. AwakE

    AwakE Banido

  8. sim...o matlab revela erro em : else if (mod (A(I,J))~=0) & A(I,J)=J)
     
  9. já nao é preciso, obrigada. vai aqui a resolução p quem tiver curiosidade.


    function V=problemaD(A)

    [L,C] = size(A);
    V = zeros(1, L);
    I = 1;

    while I <= L
    P = 1;
    J = 1;
    M = -inf;
    Q = -1;

    while J <= C

    if (mod(A(I,J), 2) ~= 0 & A(I,J) == J)
    if (P == 0)
    P = 1;
    end
    P = P * A(I,J);
    end


    if (M ~= A(I,J))
    Q = Q + 1;
    end;

    if (A(I,J) > M)
    M = A(I, J);
    end

    J = J + 1;
    end

    V(I) = P + Q;
    I = I + 1;

    end
    end
     

Partilhar esta Página