【问题标题】:ismember for string-matrix cell elements in MATLABismember 用于 MATLAB 中的字符串矩阵单元格元素
【发布时间】:2011-05-19 19:10:25
【问题描述】:

ismember 检查元胞数组或矩阵元素。我们如何一起检查字符串数字元素?请看下面:

cell1 = {'netincome' [1] ; 'equity' [2] }  ;

cell2 = { 'cogs' [2222] [1] ; 'equity' [3501] [2] ; 

          'equity' [3333] [1] ; 'netincome' [1751] [1] } ;

这失败了 ->ismember(cell1(:,[1 2]), cell2(:,[1 3]) % 我知道为什么失败了。

有什么方法可以匹配来自 2 个单元格的字符串元素和数字元素?我尝试独立使用 ismember(使用了 cell2mat func),但仍然无法找到正确的答案。想要的答案是:

[1751 ; 3501] ; OR 'netincome' [1751] [1] ; 'equity' [3501] [2] 

【问题讨论】:

  • 几个问题:cell1cell2 中的条目是否唯一(即没有重复)? cell1 中的条目是否保证与 cell2 中的匹配?
  • Ans1.当您同时考虑 col1 和 col2 时,cell1 条目是唯一的。 cell2 条目对于 col1 和 col3 不是唯一的。某些行可以重复 Ans2。是的,永远!

标签: matlab


【解决方案1】:

我认为这种情况没有任何好的内置解决方案。目前我能想到的最好的方法是创建两个嵌套循环来比较每个单元格数组的所有行,使用函数ISEQUAL 进行比较:

index = zeros(size(cell1,1),1);
for row1 = 1:size(cell1,1)
  for row2 = 1:size(cell2,1)
    if isequal(cell1(row1,:),cell2(row2,[1 3]))
      index(row1) = row2;
      break
    end
  end
end

结果将是 N×1 向量 index 中的一组匹配索引,其中 N 是 cell1 中的行数。如果cell1的一行不能与cell2的任意一行的数据匹配,那么index的对应条目将为0。index中的匹配索引将保留数据的原始顺序在cell1。此外,此代码忽略了 cell2 中的多个匹配项,仅返回找到的第一个匹配项的索引并中断内部循环(这可能会减少所需的迭代次数)。

现在您可以索引cell2 以获取与cell1 中的内容对应的数据:

>> cell2(index,:)

ans = 

    'netincome'    [1751]    [1]
    'equity'       [3501]    [2]

【讨论】:

  • 感谢新手。我维持秩序很重要!你能建议改变吗?将不胜感激。
  • @Maddy:我已经更新了我的答案,以便保持顺序。
  • 嗨..请参阅我对您的 1Q 的回复。我正在尝试查看是否可以处理/删除 cell2 中的重复。如果您有任何 cmets,请告诉我。谢谢。
  • 一种方法是使用mathworks.com/matlabcentral/fileexchange/… 运行cell2,然后将其结果输入到您的代码中。
  • @Maddy:如果cell2中有重复的行,比如{'equity' 3501 2}多次出现,你只需要匹配其中的1个,那么上面的代码就可以正常工作。如果您有像{'equity' 3501 2}{'equity' 3333 2} 这样的行,其中除了第二列之外的所有内容都重复,您需要做出一些决定。如果您仍然只需要匹配一个,并且您不关心哪个或者您想使用第一个,那么上面的代码仍然可以正常工作。如果您需要匹配所有次出现或基于条件匹配,则需要对代码进行一些小的修改。
猜你喜欢
  • 2014-04-14
  • 1970-01-01
  • 1970-01-01
  • 2015-01-22
  • 2017-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多