MatLab - Cellfun where func = strcmp 查找元胞数组中 str 变化的位置

MatLab - Cellfun where func = strcmp Find where str changes in a cell array

我有一个字符串元胞数组,我想检测字符串更改的次数并获取更改的索引。鉴于 Matlab 的 cellfun 函数,我正在尝试使用它而不是循环。这是所有代码。感谢您抽出宝贵的时间、反馈和意见。

% 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个零。我真的很感激解释为什么会出现这种意想不到的结果。

谢谢

如果我正确理解你的问题,你应该比较 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

直接 provided by Matt correctly shows the issue with your code. However, you can use 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

您可以使用 unique, and then apply diff 将字符串转换为数字标签以检测变化:

[~, ~, u] = unique(names);
result = ~diff(u);