• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

twooneboy

Matlab

14 mensagens neste tópico

olá! muito bom dia! sou novo aqui e nao sei se estou apostar no sitio certo a minha duvida!

eu tenho umas duvidas sobre o matlab é que tenho de fazer um projecto para entregar e nao esta a ser muito facil! vou postar aqui o link do projecto e o que eu fiz ate agora... se alguem dar.me umas dicas ficava muito grato!

http://www.io.fc.ul.pt/fisica/projectos/spotiwave/deteccao_remota/Projecto_05_2009.pdf

projecto:

function main

close all; clear all; clc;

load('C:\Users\Frederico\Desktop\Data_M04\A2004214142500_sst_2.dat');

load('C:\Users\Frederico\Desktop\Data_M04\A2004215133000_sst_2.dat');

load('C:\Users\Frederico\Desktop\Data_M04\A2004216141500_sst_2.dat');

load('C:\Users\Frederico\Desktop\Data_M04\A2004217132000_sst_2.dat');

load('C:\Users\Frederico\Desktop\Data_M04\A2004218140000_sst_2.dat');

load('C:\Users\Frederico\Desktop\Data_M04\A2004219130500_sst_2.dat');

load('C:\Users\Frederico\Desktop\Data_M04\A2004221143500_sst_2.dat');

load('C:\Users\Frederico\Desktop\Data_M04\A2004222133500_sst_2.dat');

load('C:\Users\Frederico\Desktop\Data_M04\A2004222134000_sst_2.dat');

load('C:\Users\Frederico\Desktop\Data_M04\A2004223142000_sst_2.dat');

load('C:\Users\Frederico\Desktop\Data_M04\A2004224132500_sst_2.dat');

load('C:\Users\Frederico\Desktop\Data_M04\A2004225141000_sst_2.dat');

STT_aux=zeros(201,201,12);

for ti=1:1:201

    for i=1:1:201

        for j=1:1:201

            STT_aux(i,j,ti)=sum(i,j,ti-5:ti)/12;

            if STT_aux(i,j,ti)=NaN

                NaN=NaN

            end

        end

           

    end

end

for omega=1:1:201

    for i=1:1:201

        for j=1:1:201

            indice = |max(pixel(i,j)- min(pixel(i,j)|*omega;

        end

    end

end

           

figure;

pcolor(indice); shading flat;caxis([min max]);colorbar;

end

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Primeiro, podes utilizar apenas for i=1:201, o time-step é 1 por defeito.

Segundo, a variável auxiliar serve para guardares as 12 imagens lá e depois realizares as operações que precisas. Ou seja, o primeiro passo a seguir a alocar memória para a variável é fazer algo deste estilo:

SST_aux(:,:,1) = matriz_com_imagem1;

SST_aux(:,:,2) = matriz_com_imagem2;

etc.

Podes imaginar esta variável como sendo 12 camadas sobrepostas em que cada uma delas tem a imagem correspondente a um dia.

No primeiro caso aquilo que te pedem é que aches a média temporal das imagens, ou seja, que devolvas uma matriz que tenha em cada posição (i,j) a média das 12 imagens nessa posição.

Penso que aqui precisas de um esclarecimento. Quando tens, como neste caso, um tensor de ordem 3 (é uma matriz mas com "uma dimensão adicional"), se fazes SST_aux(i,j,;) aquilo que obténs é um vector com os pontos (i,j) de cada uma das 12 imagens.

É exactamente a média deste vector que tu queres calcular. O código seria algo deste estilo

media_t = zeros(201,201);

for i=1:201

  for j=1:201

      media_t(i,j) = sum(SST_aux(i,j,:D)/12;

  end

end

Que era algo que tu estavas quase a tentar fazer. Uma alternativa seria aplicar directamente a função mean que calcula a média aritmética do vector em vez de estar a somar e a dividir por 12.

Uma última nota: este código não vai funcionar já que no enunciado está bem explícito que alguns pontos estão a NaN devido a nuvens que tornam impossível o cálculo da temperatura do mar, terás portanto que utilizar outra função que não o mean ou o sum (estes devolvem NaN se existir um valor NaN no vector). Que função é essa? Eu sei mas vou deixar-te pesquisar, o help do matlab e o google são teus amigos =).

Bom trabalho.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

muito obrigado =)

sim sim vou peskisar, so tinha essa duvida dos vectores =P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já agora deixa-me alertar-te: na segunda alínea não estás a proceder correctamente. O omega é o desvio padrão que é diferente para cada pixel (i,j) e corresponde ao desvio padrão da temperatura nos 12 dias nesse pixel (i.e. tens que calcular previamente para cada pixel e de preferência guardar numa matriz para não teres que repetir os cálculos).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pessoal já agora ajudem me aqui nisto por favor

estou a escrever uma funçao que agarra numa matriz e permite ao utilizador acrescentar uma linha nova, caso o 1o elemento da linha a acrescentar seja igual a outro 1o elemento de qq linha já existente na matriz, é suposto o utilizador ser avisado e nao deve ser acrescentada uma linha mas sim substituida a linha cujo 1o elemento é igual ao 1o elemento da linha q se quer acrescentar.

entao escrevi esta parte assim:

for i=1:length(A(:,1))

      if A(i,1) == a   

    disp(' Aluno já existente na lista');

      A(i,:thumbsup: = [a b c d e f g];

    else

           

        A(length(A(1,:))+1,:)= [a b c d e f g];

     

      end

     

  end

a = primeiro elemento da linha

b c d  e f g= restantes elementos...

para o caso em que o 1o elemento já existia, isto funciona...mas quando é uma linha com elementos novos para alem de ser acrescentada a linha nova que eu quero , sao tambem acrescentadas duas linhas nulas...eu sei q deve ser por causa do ciclo for, mas nao vejo outra maneira de fazer isto.

se me puderem ajudar agradeço imenso

cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Desculpem enganei-me, queria dizer no inicio i= 1:1:length(A(:,1)) e nao i=1:length(A(:,1))

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Desculpem enganei-me, queria dizer no inicio i= 1:1:length(A(:,1)) e nao i=1:length(A(:,1))

Primeiro, tal como já expliquei acima, escrever de uma forma ou de outra é equivalente.

Segundo, deves colocar a tua dúvida no teu próprio tópico em vez de usares o tópico de outra pessoa, porque não estás a falar da mesma coisa.

Terceiro, estás a adicionar linhas em cada iteração do for, o que não faz grande sentido, deves substituir se o valor for igual, sim, mas caso não seja só deves adicionar quando saíres do ciclo for (não que isso faça diferença no resultado final porque a condição de paragem não é actualizada no meio do ciclo - se fosse adicionarias uma linha no fim da matriz por cada linha que não fosse igual, mas apenas porque não é eficiente nem "bonito")

Quarto, o erro que está a provocar esse comportamento anormal é:

A(length(A(1,:thumbsup:)+1,:)=[a b c d e f g];

Como length(A(1,:)) é o tamanho da primeira linha, dá-te o número de colunas da matriz. Como tens mais 2 colunas do que linhas na tua matriz, adicionas essa linha como sendo a (numerodecolunas+1)-ésima linha, deixando duas linhas em "branco". Deves substituir isso por length(A(:,1)).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

boa noite.

dscp mais uma x pedrosorio mas vai ficar assim a media c o NaN?

for i=1:201

  for j=1:201

      STT_aux(i,j) = nanmean(SST_aux(i,j,:thumbsup:,3)/12;

  end

end

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

boa noite.

dscp mais uma x pedrosorio mas vai ficar assim a media c o NaN?

for i=1:201

  for j=1:201

      STT_aux(i,j) = nanmean(SST_aux(i,j,:thumbsup:,3)/12;

  end

end

Não tens que pedir desculpa nenhuma, estamos aqui para tirar dúvidas (e não só).

Deves criar uma outra variável que seja apenas uma matriz, antes, por exemplo:

STT_aux = zeros(201,201); %Criar a matriz e preenchê-la com zeros antes torna o programa mais rápido

(espero que teres escrito STT_aux em vez de SST_aux fosse intencional).

Em relação ao código que estás a usar propriamente dito, fizeste algo mais inteligente do que eu pensei, mas que não funciona porque está uma grande salganhada.

O que fizeste foi usar o nanmean numa versão que se aplica a matrizes (a tensores neste caso). No fundo tu tens 12 matrizes umas "em cima" das outras e queres obter uma matriz que é a média dessas matrizes todas, portanto queres obter a média ao longo da dimensão 3 (a dimensão 1 são as linhas das matrizes, a 2 são as colunas, a 3 é a dimensão que indica o dia).

A parte inteligente é que usar uma função que se aplica directamente a tensores é muito mais rápido do que fazer for. Ao início tinha pensado em algo deste estilo:

STT_aux = zeros(201,201);
for i=1:201
   for j=1:201
      STT_aux(i,j) = nanmean(SST_aux(i,j,);
   end
end

No entanto, tu reparaste, e muito bem, que podes indicar a dimensão ao longo da qual fazes a média. Nesse caso o código deveria ser:

STT_aux = nanmean(SST,3);

Pura e simplesmente isto. Ele pega nas tuas 12 matrizes sobrepostas, faz a média ao longo da 3ª dimensão (i.e. o dia) e como tal devolve uma matriz que tem em cada posição a média das 12 matrizes nessa posição. Tudo isto sem ciclos for e nem sequer precisas de inicializar a matriz STT_aux porque isso só é benéfico quando usas um ciclo para construir a matriz.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

uhm....quando ponho a correr aparece-me muitos NaN's. devia aparecer? eu acho que nao!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

uhm....quando ponho a correr aparece-me muitos NaN's. devia aparecer? eu acho que nao!

Achas mal =P

Se por acaso tens pixeis que estão cobertos por nuvens todos os dias então nesses não tens qualquer informação.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora