Проблема с клеточной логической индексацией в Matlab - PullRequest
2 голосов
/ 29 сентября 2010

Я читаю данные из URL, анализирую их, а затем пытаюсь форматировать данные далее:

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 будет работать. Почему это работает на ветер, а не на порыв?

Ответы [ 3 ]

5 голосов
/ 29 сентября 2010

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

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
4 голосов
/ 29 сентября 2010

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

wind(cellfun(@isempty,wind)) = {0};
gust(cellfun(@isempty,gust)) = {0};
1 голос
/ 29 сентября 2010

Скобки имеют значение:

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


Выписка из клеточных массивов и их содержимого

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...