【问题标题】:Recognize relevant string information by checking the first characters通过检查第一个字符来识别相关的字符串信息
【发布时间】:2014-04-21 10:02:02
【问题描述】:

我有一张有 2 列的表格。在第 1 列,我有一个字符串信息,在第 2 列,我有一个逻辑索引

%% Tables and their use

T={'A2P3';'A2P3';'A2P3';'A2P3 with (extra1)';'A2P3 with (extra1) and (extra 2)';'A2P3 with (extra1)';'B2P3';'B2P3';'B2P3';'B2P3 with (extra 1)';'A2P3'};
a={1 1 0 1 1 0 1 1 0 1 1 }

T(:,2)=num2cell(1);
T(3,2)=num2cell(0);
T(6,2)=num2cell(0);
T(9,2)=num2cell(0);

T=table(T(:,1),T(:,2));

class(T.Var1);
class(T.Var2);

T.Var1=categorical(T.Var1)
T.Var2=cell2mat(T.Var2)

class(T.Var1);
class(T.Var2);

if T.Var1=='A2P3' & T.Var2==1
    disp 'go on'
else
    disp 'change something'
end

更新:

  • 我会在知道如何将工作区复制为代码格式后立即更新此部分

** 仍然不知道该怎么做,但它就是这样

*** 为什么使用表格是一把双刃剑(但仍然很酷):我必须非常清楚表格内的类才能在 if else 构造中引用它,这里我必须转换两列分类并从单元格中加倍以使其工作...

这是我的数据的样子:

我想要这个:

if T.Var1=='A2P3*************************' & T.Var2==1
    disp 'go on'
else
    disp 'change something'
end

我设法告诉 matlab 按照我的意愿去做,但这篇文章的重点是:我如何告诉 matlab 忽略字符串中 A2P3 之后的内容,其中字符串长度是可变的?因为否则查找留在 A2P3(以及 B2P3 等)上的每一条字符串信息只是为了说 thay 会非常累人。

我该怎么做?

【问题讨论】:

  • 我们可以假设一个有 2 列的元胞数组吗?
  • 我可以,但这会让我更难将它转换回我原来的表结构。你的建议会是什么样子?我对各种长度的通配符特别感兴趣,可以说“abc 在 abc11one 中很重要”。所以如果 abc 在第一部分,它已经可以了。
  • 用于在表格中查找文本我使用分类,但我很好奇你在这种情况下实现通配符。
  • 在您上传的屏幕截图中,您只有一列。
  • 问题是我正在运行一个持续数小时的脚本,并且想快速发布最重要的信息,因此图片中没有 1 和 0。对此我很抱歉,但我可以在明天发布它的更新。此外,如果您告诉我如何从环境中提取嵌套结构并将它们放置在网络中,这将有所帮助。我听说过两种方法,一种是我没有的 2014a 的内置功能,另一种是我不理解的长脚本。

标签: string matlab identify


【解决方案1】:

假设您正在使用代码中列出的T(元胞数组),您可以使用此代码来检测成功匹配 -

%%// Slightly different than yours
T={'A2P3';'NotA2P3';'A2P3';'A2P3 with (extra1)';'A2P3 with (extra1) and (extra 2)';'A2P3 with (extra1)';'B2P3';'B2P3';'NotA2P3';'B2P3 with (extra 1)';'A2P3'};
a={1 1 0 1 1 0 1 1 0 1 1 }

T(:,2)=num2cell(1);
T(3,2)=num2cell(0);
T(6,2)=num2cell(0);
T(9,2)=num2cell(0);

%%// Get the comparison results
col1_comps = ismember(char(T(:,1)),'A2P3') | ismember(char(T(:,1)),'B2P3');
comparisons = ismember(col1_comps(:,1:4),[1 1 1 1],'rows').*cell2mat(T(:,2))

【讨论】:

  • 对我有用。仅比较第一个字符并让其他字符为 0 非常聪明。我喜欢它可以如何模块化地适应前 6 个字符等。非常感谢!
【解决方案2】:

一种快速的解决方案是创建一个接受 2 个字符串并检查第一个字符串是否以第二个字符串开头的函数。

稍后编辑:

函数将如下所示:

for i = 0, i < second string's length, i = i + 1
    if the first string's character at index i doesn't equal the second string's character at index i
        return false
after the for, return true

假设第二个字符的长度总是小于第一个字符。否则,返回交换了参数的函数。

【讨论】:

  • 怎么样?字符串并不总是一样长。这就是我要找的,某种可以有任意长度的通配符。
  • 谢谢,但我正在寻找的不是我的字符串的简单长度分类器,我试图忽略具有相同开头的太长字符串。我更新了我的第一个问题。
猜你喜欢
  • 2017-12-03
  • 2015-10-17
  • 2015-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-23
  • 2013-11-26
  • 1970-01-01
相关资源
最近更新 更多