Проверьте наличие определенной строки в Cell-Array в MATLAB

Предполагая, что у меня есть такой массив ячеек:

1x25 double   1x25 double   1x25 double   1x11 double   'Mean'
1000          0             0             5                0
1000          10            5             100              0    
1000          20            5             200              0    
1000          30            5             100              0    

И теперь я хотел бы проверить, есть ли ЛЮБАЯ строка в этом массиве ячеек, где первый столбец - 1000, второй столбец - 30, третий столбец - 5, а четвертый столбец - 100 - как это сделать? Первой строкой следует пренебречь, так как в ней есть только заголовки столбцов.

Я придумал довольно странный подход:

sum(sum([[data{2:end, 1}]'==1000  [data{2:end, 2}]'==30 [data{2:end, 3}]'==5 [data{2:end, 4}]'==100], 2)==4)

Принимая во внимание, что результат должен быть > 0, чтобы было хотя бы одно вхождение data-tupel... Заранее спасибо

EDIT: я придумал:

found = ismember([1000 30 5 100], cell2mat(data(2:end, 1:4)), 'rows')

Я думаю, что это решение довольно хорошее, но если у вас есть еще лучший подход, просто опубликуйте его. Это не должно быть быстро, просто должно быть читабельным и простым.


person tim    schedule 23.11.2013    source источник


Ответы (1)


Это, пожалуй, проще:

all(bsxfun(@eq, cell2mat(data(2:end,1:4)), [1000 30 5 100]),2)

Другая возможность (возможно, медленнее):

arrayfun(@(n) all([data{n,1:4}]==[1000 30 5 100]),(2:size(data,1)).')
person Luis Mendo    schedule 23.11.2013
comment
Это тоже хорошо, но мне больше нравится ismember, потому что он более интуитивно понятен, поскольку имя функции дает то, что может делать функция :) - person tim; 23.11.2013
comment
@bjoern Ну, для меня имя @eq столь же интуитивно понятно :-) - person Luis Mendo; 23.11.2013
comment
Ага, почему бы и нет ;-) Принимаю я или нет, разницы не делаю, поэтому принимаю сейчас ;-) - person tim; 23.11.2013