Matlab

MadalenaM

Membro
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
 
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
 
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 :)
 
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.
 
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 :)

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:
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!!!!
 
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
 
Back
Topo