2010-09-28 7 views
2

Je lis des données à partir d'une URL, l'analyse, puis essayer de formater les données de plus:problème avec l'indexation logique cellulaire dans Matlab

year = 2008; 
month = 9; 
day = 30; 

raw = urlread(sprintf('http://www.wunderground.com/history/airport/KCVS/%i/%i/%i/DailyHistory.html?HideSpecis=0&theprefset=SHOWMETAR&theprefvalue=0&format=1',year,month,day)); 
data = textscan(raw,'%s %s %s %s %s %s %s %s %s %s %s %s','Delimiter',',','HeaderLines',2,'CollectOutput',true); 

dir = data{1}(1:end-1,7); 
wind = cellfun(@str2num,data{1}(1:end-1,8),'UniformOutput',false); 
gust = cellfun(@str2num,data{1}(1:end-1,9),'UniformOutput',false); 

wind{cellfun(@isempty,wind)} = 0; 
gust{cellfun(@isempty,gust)} = 0; 

Maintenant wind{cellfun(@isempty,wind)} = 0; fonctionne cependant gust{cellfun(@isempty,gust)} = 0; n'a pas, au lieu que je reçois ce erreur qui dit: ??? Le côté droit de cette affectation a trop peu de valeurs pour satisfaire le côté gauche. cellfun(@isempty,gust) renvoie correctement un tableau logique. Aussi gust{1} = 0 fonctionnera. Pourquoi ça marche pour le vent mais pas pour la rafale?

+0

vous utilisez la mauvaise variable pour construire l'url, il devrait être 'day' pas 'date' à la fin ?? – Amro

+0

@Amro typo :(mais merci – Elpezmuerto

Répondre

4

La raison pour laquelle wind{cellfun(@isempty,wind)} fonctionne mais ne pas gust{cellfun(@isempty,wind)} est tout simplement que le vent arrive à avoir un seul élément non vide. En ce qui concerne le vrai problème, l'indexation d'un tableau de cellules avec des accolades renvoie les éléments des cellules indexées; lorsqu'il est utilisé avec un index non-scalaire, tel qu'un tableau logique, vous renvoyez essentiellement la valeur de chaque élément, une à la fois (vous pouvez voir que la variable ans est remplacée 33 fois). Au lieu de cela, vous devez utiliser des parenthèses pour indexer le tableau, ce qui revient à renvoyer les cellules d'un tableau de cellules, et écraser les éléments du tableau - les cellules - avec une cellule contenant ce que vous voulez. Par conséquent

wind(cellfun(@isempty,wind)) = {0}; 
gust(cellfun(@isempty,gust)) = {0}; 
+0

Je commençais tout juste à remarquer que le 'ans' était en train d'être écrasé 33 fois avant de répondre. – Elpezmuerto

1

Les accolades font la différence:

wind(cellfun(@isempty,wind)) = {0}; 
gust(cellfun(@isempty,gust)) = {0}; 


Extrait de Cell Arrays and Their Contents

Utilisez bouclés accolades {} pour définir ou obtenir les contenu des réseaux de cellules. Utilisez les parenthèses() pour indexer dans un tableau de cellules pour collecter un sous-ensemble de cellules ensemble dans un autre tableau de cellules.

5

est ici légèrement meilleure façon d'analyser les données:

year = 2008; month = 9; day = 30; 

%# get raw data 
urlStr = sprintf('http://www.wunderground.com/history/airport/KCVS/%i/%i/%i/DailyHistory.html?HideSpecis=0&theprefset=SHOWMETAR&theprefvalue=0&format=1',year,month,day); 
raw = urlread(urlStr); 

%# collect data and headers 
raw = strrep(raw, '<br />', '');  %# remove HTML <br/> at end of each line 
raw = textscan(raw,repmat('%s ',1,12), 'Delimiter',',', 'HeaderLines',1, 'CollectOutput',true); 
headers = raw{1}(1,:); 
data = raw{1}(2:end-1,:); 

%# extract certain columns 
A = data(:,7);    %# cell array of strings 
B = str2double(data(:,8:9)); %# numeric data 
B(isnan(B)) = 0; 

où:

>> B 
B = 
      5.8   0 
      5.8   0 
      5.8   0 
      0   0 
      0   0 
      5.8   0 
      4.6   0 
      0   0 
      3.5   0 
      4.6   0 
      6.9   0 
      9.2   17.3 
     12.7   20.7 
     13.8   19.6 
      15   0 
     11.5   0 
     11.5   0 
      9.2   0 
      8.1   0 
      9.2   0 
      9.2   0 
      9.2   0 
     10.4   0 
     10.4   0 
Questions connexes