2015-02-03 6 views
2

У меня есть гетерогенная ячейка, содержащая в основном числа, но один столбец символов. Я хотел бы идентифицировать те строки, в которых значение в столбце символов равно определенной строке, 'X'. Мой массив выглядит примерно так:Логическое индексирование символов в гетерогенной ячейке в MATLAB

array_name = { [0] [2] 'X' ; 
       [4] [1] 'X' ; 
       [9] [7] 'A' ; 
       [9] [1] 'X' ; 
       [4] [4] 'B'}; 

Мой вопрос два раза:

(1) С помощью array_name == 'X' не возвращает логический вектор Я бы ожидать при его использовании на числовой массив, как Я делаю это?

(2) Как я могу создать новый массив, состоящий только из тех строк, которые удовлетворяют условие, что значение в столбце символьного быть равно 'X', так что мой результат будет выглядеть следующим образом:

new_array = { [0] [2] 'X' ; 
       [4] [1] 'X' ; 
       [9] [1] 'X'}; 

Меня интересует только (1), поскольку я полагаю, что это необходимо для (2).

Любые советы приветствуются!

ответ

3

Получить третий столбец как через запятую и сцепить его в массив, то вы можете использовать логическую индексацию:

L=[array_name{:,3}]=='X' 
new_array=array_name(L,:) 

В качестве альтернативы вы можете использовать strcmpi, который может иметь дело с более чем одним символом.

L=strcmpi(array_name(:,3),'X') 
new_array=array_name(L,:) 
+2

О, хороший ответ, ха-ха, я определенно переусердствовал. +1 –

+0

И я тоже. Большое вам спасибо. Не могли бы вы вкратце объяснить в комментарии, почему это работает при использовании скобок вокруг имени массива, и это происходит не тогда, когда вы просто используете «array_name {:, 3} == 'X'"? – Constantin

+0

'array_name {:, 3}' - список, разделенный запятыми, сравнение с использованием 'eq' невозможно. Вы должны использовать '[]' для получения массива. Вы можете найти объяснение о списках, разделенных запятыми: http://www.mathworks.com/help/matlab/matlab_prog/comma-separated-lists.html?s_tid=doc_12b – Daniel

0

Я не совсем понимаю, на 1-ый вопрос, извините, но вот ответ на 2-й тот, который я думаю, что будет отвечать на 1-ый, а также.

Ответ использует regular expressions и преимущество, которое они обеспечивают в том, что вы можете сразу просмотреть массивы ячеек и получить логические значения при совпадении совпадений.

Пример:

clear 
clc 

array_name = { [0] [2] 'X'; 
    [4] [1] 'X'; 
    [9] [7] 'A' ; 
    [9] [1] 'X' ; 
    [4] [4] 'B'} 

%// Check for string 'X' in the cell array. 
FindX = regexp('X',array_name(:,end)) 

Выходной сигнал представляет собой клетку, содержащая логические индексы совпадений:

FindX = 

    [1] 
    [1] 
    [] 
    [1] 
    [] 

Затем проверьте непустые клетки, то есть те, которые имеют значение 1; матч

Idx = ~cellfun(@isempty,FindX); 

Idx = 

    1 
    1 
    0 
    1 
    0 

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

OutRows = array_name(Idx,:) 

OutRows = 

    [0] [2] 'X' 
    [4] [1] 'X' 
    [9] [1] 'X' 
0

Вы можете использовать тот факт, что strcmp работает на клеточных массивов, и возвращает 0, если один из его аргументов а не строка (а также, если строки разные).Так,

  • На вопрос (1):

    result1 = strcmp(array_name,'X'); 
    

    , который дает, в вашем примере,

    result1 = 
        0  0  1 
        0  0  0 
        0  0  0 
        0  0  1 
        0  0  0 
    
  • На вопрос (2):

    result2 = array_name(strcmp(array_name(:,3),'X'),:); 
    

    который дает

    result2 = 
        [0] [2] 'X' 
        [4] [1] 'X' 
        [9] [1] 'X' 
    

Преимущество этого подхода заключается в том, что она работает, даже если столбец 3 не содержит только строки. Например,

array_name = { [0] [2] 'X' ; 
       [4] [1] 5 ; 
       [9] [7] 'A' ; 
       [9] [1] 'X' ; 
       [4] [4] 6 }; 

result1 = 
    0  0  1 
    0  0  0 
    0  0  0 
    0  0  1 
    0  0  0 

result2 = 
    [0] [2] 'X' 
    [9] [1] 'X' 
Смежные вопросы