元胞数组中部分字符串的 Matlab 引用

Matlab referencing of part of string in cell array

我正在寻找一种方法来引用存储在元胞数组中的部分字符串。我需要这样做才能做出逻辑语句,将我要查找的字符串与元胞数组中的字符串部分匹配。

假设我的元胞数组如下所示:

cellname = { 'B_1J_1234_1236' , 'A_1W_2345_2349' , 'C_2J_9876_9879' , 'B_1W_5432_5438'}

我希望在元胞数组中找到满足以下条件的字符串:

  1. 'B' 作为字符串的第一部分
  2. '1W' 作为字符串的第二部分
  3. 第一个数(第三部分)小于5434
  4. 第二个数(第四部分)大于5436

我知道我可以获得满足我的前两个搜索条件的元素的索引,方法是:

find(strncmp(cellname,'B_1W',4))

但我找不到包含后一个条件的方法。有什么想法吗?

编辑: 理想情况下,我想我想做点什么:

find(strncmp(cellname,'B_1W',4) & cellname{ "any element" } (6:9) < 5434 & cellname{ "any element" } (11:14) > 5436)

但是引用了"any element"的一部分,我不知道该怎么做。

您可以使用cellfun和一个自定义函数来解决这个问题。在此函数中,您可以使用 strsplit 和分隔符 _ 将字符串拆分为子字符串。然后简单地检查是否满足所有条件,相应地 returns truefalse。请注意,我们需要将第三和第四个字段中的字符串转换为数字。这可以通过 str2double.

来完成
function main
    cellname = { 'B_1J_1234_1236' , ...
                 'A_1W_2345_2349' , ...
                 'C_2J_9876_9879' , ...
                 'B_1W_5432_5438' };

    R = cellfun(@check, cellname, 'UniformOutput',1)
    find(R==true)
end


function out = check(in)
    S = strsplit(in,'_');
    out = strcmp(S{1},'B') && strcmp(S{2},'1W') && ...
          str2double(S{3})<5434 && str2double(S{4})>5436
end

这是输出:

R =
     0     0     0     1
ans =
     4

如果您想使用与您提议的类似的东西,您也可以使用 cellfun

find(strncmp(cellname,'B_1W',4) & ...
         cellfun(@(x)str2double(x(6:9))<5434,cellname) & ...
         cellfun(@(x)str2double(x(11:14))>5436,cellname))

与马特的非常相似,但在一条线上

cellfun(@(x) strcmp(x{1}, 'B') && strcmp(x{2}, '1W') && (str2num(x{3}) < 5434) && (str2num(x{4}) > 5436), cellfun(@(x) strsplit(x, '_'), cellname(:)', 'uni', 0))

使用正则表达式:

cellfun(@(x) ~isempty(x) && str2num(x.m)<5434 && str2num(x.n)>5436, ...
    regexp(cellname, '^B_1W_(?<m>\d+)_(?<n>\d+)', 'names'))