2015-08-22 2 views
0

У меня есть массив ячеек даты, который считывается из файла csv. Формат ниже: ДатаРазличные результаты от STRREAD() для чтения строк

=

'2008.12.01'

'2008.12.02'

'2008.12.03'

'2008.12.04'

'2008.12.05' ... ...

И я хочу :

  1. превратить массив ячеек в массив строк,
  2. использовать strread(), чтобы прочитать его "YYYY", "мм" и значение "DD" в 3 двойной массив [год, мм, дд] ,
  3. использовать datenummx(), чтобы включить [год, мм, дд] в серию номер.

После того, как я использовать

Date = полукокса (дата);

массив дата станет следующим образом:

дата =

2008.12.01

2008.12.02

2008.12.03

2008.12.04

2008.12.05 ... ...

, который я думаю, что результат является то, что я хочу ...

Но после того, как я использую strread(), это дает мне странный результат.

[год, месяц, день] = strread (дата, '% d% d% d', 'разделитель', '');

год =

-1 

0 

0 

0 

0 

... ...

НО, если я использую код ниже, strread() может дать мне правильный ответ:

s = sprintf ('2008.12.01 ')

s =

2008.12.01

[год, месяц, день] = strread (с,' % d% d% d '' разделитель», '')

год =

2008 

месяц = ​​

12 

день =

1 

И я проверил в MATLAB, что как "дата" и "s" представляет собой массив символов. (С помощью функции «ischar 'и просто отображать оба) ...

Но почему strread() дает отличные результаты?

Может ли кто-нибудь ответить?

, кстати, я использую v6.5 MatLab. (По моей причине, пожалуйста, не комментируйте, спрашивая «почему бы не использовать более позднюю версию») ....

ответ

0

Ваша проблема эта строка:

date = char(date); 

Он не создает массив строк, в Matlab нет массива строк. Он создает массив символов. Как вы уже заметили, ваш strread -линии прекрасно, если вы вводите один дату, поэтому ввод каждой даты образуют исходный массив ячеек по отдельности:

for idx=1:numel(date) 
    [year(idx),month(idx),day(idx)]=strread(date{idx},'%d%d%d','delimiter','.'); 
end 

Предварительное выделение в год, месяц и день повышает производительность.

+0

Спасибо, Даниэль ... и мне интересно, есть ли способ, которым я могу выполнить цикл без «для»? Я слышал, что это очень медленно, когда обрабатывают большой объем данных. –

+0

А также, мне интересно, не может ли «strread» принять массив символов в качестве входных данных, почему бы ему не вернуть ** ERROR ** вместо получения нечетного результата? –

+0

У меня нет опыта работы с такими старыми версиями Matlab. Используйте preallocation и проверьте его. – Daniel