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);
我有一个字符串元胞数组,我想检测字符串更改的次数并获取更改的索引。鉴于 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
直接
>> 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);