2013-04-17 3 views
0

У меня проблема, я думаю, что я уже ответил, но это не сработало. Вот сделка:Filtering Cell Array - MatLab

У меня есть большой массив ячеек (около 300000x60) с некоторыми числовыми данными, некоторые даты, некоторые заготовки, некоторые строки, которые я должен фильтровать (как в Excel): Например:

m = ... 
{ 'date ' 'code' 'number' 'market' 'max'  'min'  
'01/01/2000' 'tsa' 1   0  0.9  0.0008 
'01/01/2000' 'sje' 2   0  1.8  1.5 
'01/02/2000' 'koi' 1   1  5.5  1.8 
'02/01/2000' 'sjk' 2   0  5.8  3.5 
'05/02/2000' 'kkj' 5   7  5.5  3.8 }; 

можно фильтровать строки ('код' столбцов) с:

b = m(strcmp('tsa',m(:,2)),:); 

и как результат:

b = 
'01/01/2000' 'tsa' 1   0  0.9  0.0008 

(это отлично работает).

НО, когда я попытался отфильтровать числа, с c=m([m{:,3}] == 1,:); У меня были некоторые странные ответы в «c» (я получил массив ячеек со всеми возможными значениями в столбце 3, а не только те, которые соответствуют числу «1» «)!

Я хочу, чтобы ответ, как:

c = m([m{:,3}] == 1,:) 
    c = 
    '01/01/2000' 'tsa' 1   0  0.9  0.0008 
    '01/02/2000' 'koi' 1   1  5.5  1.8 

кто может мне помочь?

Заранее благодарен!

+3

'cell' является зарезервированной функцией в MATLAB, не обфускации, создавая переменную с тем же именем. Кроме того, я не могу воспроизвести проблему с фактическим фрагментом кода. Рассмотрите возможность изменения 'cell' на' Cell' и предоставления кода, который воспроизводит проблему. – Oleg

+0

Олег, мое плохое имя. На самом деле это другое имя! – Luiz

+0

Я благодарен вашему ответу. Я знаю, что я ответил на что-то очень похожее на http://www.mathworks.com/matlabcentral/newsreader/view_thread/290278 Но эта вторая часть не сработала для меня! Не могли бы вы мне помочь? – Luiz

ответ

0

Проблема заключается в заголовках в массиве ячеек m.

Вы должны оставить заголовки из:

c = m([m{2:end,3}] == 1,:) 

Если выбран весь третий столбец, вы получите:

>> m{:,3} 
ans = 
number 
ans = 
    1 
ans = 
    2 
ans = 
    1 
ans = 
    2 
ans = 
    5 

Обратите внимание, что первая ячейка в этом столбце имеет тип char а остальные - double.

Если вы их конкатенацию:

>> [m{:,3}] 
ans = 
number  

Будьте осторожны, потому что номера не исчезли, но они были преобразованы в char, на самом деле:

>> double(ans) 
ans = 
    110 117 109 98 101 114  1  2  1  2  5 

Что сейчас происходит, является то, что сравнение проводится по этому увеличенному массиву:

>> [m{:,3}] == 1 
ans = 
    0  0  0  0  0  0  1  0  1  0  0 

Вероятно, это не тот индекс, который вы хотите.

Для проверки кода, вы можете выбрать его часть и нажать F9. Выполняется только выделенный код. Поэтому вам не нужно вводить эти команды в окне cmd, чтобы узнать, что делает часть кода.

+0

Ох. Я никогда не думал, что он держит заголовки. Я удалил заголовки и запустил код, и я получил отличные результаты. –

+0

Спасибо большое! завтра проверим это и дадим вам знать! – Luiz

+0

Эй, большое спасибо за ответ. Но у меня все еще такая же проблема (массив «c» содержит все значения столбца), я получил экран печати, но не знаю, как его показать! Кто-нибудь знает другой режим для его фильтрации? другой путь? спасибо заранее – Luiz