2010-09-28 4 views
2

Читаю данные из URL, разбор его, а затем пытается далее форматировать данные:Проблема с клеточной логической индексации в 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; 

Теперь wind{cellfun(@isempty,wind)} = 0; работает, однако gust{cellfun(@isempty,gust)} = 0; не, вместо этого я получаю это ошибка, которая говорит: ??? Правая часть этого задания имеет слишком мало значений, чтобы удовлетворить левую сторону. cellfun(@isempty,gust) правильно возвращает логический массив. Также будет работать gust{1} = 0. Почему это работает для ветра, но не для порыва?

+0

вы используете неправильную переменную для построения URL, он должен быть 'day' не 'дата' в конце ?? – Amro

+0

@Amro typo :(но спасибо – Elpezmuerto

ответ

4

Причина, по которой wind{cellfun(@isempty,wind)} работает, но gust{cellfun(@isempty,wind)} не просто, что ветер бывает иметь только один непустой элемент. Что касается реальной проблемы, индексирование массива ячеек с фигурными скобками возвращает элементы индексированных ячеек; при использовании с нескалярным индексом, таким как логический массив, вы по существу возвращаете значение каждого элемента по одному (вы можете видеть, что переменная ans переписывается 33 раза). Вместо этого вы должны использовать круглые скобки для индексации массива, которые говорят, чтобы вернуть ячейки массива ячеек, и перезаписать элементы массива - ячейки - ячейкой, содержащей то, что вы хотите. Следовательно

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

Я только начинал замечать, что 'ans' был переписан 33 раза, прежде чем вы ответили. – Elpezmuerto

1

Скобы делают разницу:

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


Экстракт из Cell Arrays and Their Contents

использовать фигурные скобки {} для установки или получения содержимое ячейки массивов.

Используйте скобки() для индексирования в массив ячеек для сбора подмножества в ячейках вместе в другой ячейке.

5

Вот несколько лучший способ для разбора данных:

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; 

где:

>> 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 
Смежные вопросы