MatLab - Cellfun, где func = strcmp Найдите, где изменяется str в массиве ячеек

У меня есть массив ячеек строк, я хочу определить, сколько раз менялась строка, и получить индексы для изменений. Учитывая функцию Cellfun Matlab, я пытаюсь использовать ее вместо цикла. Вот и весь код. Я ценю ваше время, отзывы и комментарии.

% Cell Array Example
names(1:10)={'OFF'};
names(11:15)={'J1 - 1'};
names(16:22)={'J1 - 2'};
names(23:27)={'J2 - 1'};
names(28)={'Off'};
names=names';

% My cellfun code
cellfun(@(x,y) strcmp(x,y), names(1:2:end),names(2:2:end));

Моим ожидаемым результатом является вектор длиной 27 (length(names)-1), где в векторе есть 4 нуля, указывающие на то, что функция strcmp нашла 4 случая, когда сравнение не было равным.

Фактический результат — вектор длины 14 и имеет только 2 нуля. Я был бы очень признателен за объяснение, почему происходит этот неожиданный результат.

Спасибо


person MTM    schedule 06.06.2015    source источник


Ответы (3)


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

>> strcmp(names(1:end-1), names(2:end))
ans =
  Columns 1 through 14
     1     1     1     1     1     1     1     1     1     0     1     1     1     1
  Columns 15 through 27
     0     1     1     1     1     1     1     0     1     1     1     1     0
person Mohsen Nosratinia    schedule 06.06.2015
comment
Да, это лучшее решение - person Matt; 07.06.2015

Вы можете преобразовать строки в числовые метки, используя unique, а затем применить < a href="http://es.mathworks.com/help/matlab/ref/diff.html" rel="nofollow">diff для обнаружения изменений:

[~, ~, u] = unique(names);
result = ~diff(u);
person Luis Mendo    schedule 07.06.2015

Если я правильно понял ваш вопрос, вы должны сравнивать names(1:end-1) с names(2:end). То есть сравнить строку 1 со строкой 2, сравнить строку 2 со строкой 3 и так далее. Вместо этого вы используете шаг 2, сравнивая строку 1 со строкой 2, строку 3 со строкой 4 и так далее. Вы можете исправить это, изменив последнюю строку на:

cellfun(@(x,y) strcmp(x,y), names(1:end-1),names(2:end))

Тогда результат:

 Columns 1 through 20:

 1   1   1   1   1   1   1   1   1   0   1   1   1   1   0   1   1   1   1   1

 Columns 21 through 27:

 1   0   1   1   1   1   0
person Matt    schedule 06.06.2015