ismember 用于 MATLAB 中的字符串矩阵单元元素

发布于 2024-11-08 12:10:04 字数 478 浏览 0 评论 0原文

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 函数),但仍然无法找到正确的答案。

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

ismember checks for cell-array or matrix elements. How do we check for string-numeric elements together? Please see below:

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

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

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

This fails ->ismember(cell1(:,[1 2]), cell2(:,[1 3]) % I know why it fails.

Is there any way to match string elements and numeric elements from 2 cells? I tried using ismember independently (cell2mat func was used) but still can't hit the right answer. The desired answer is:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

你不是我要的菜∠ 2024-11-15 12:10:04

我认为对于这种情况没有任何好的内置解决方案。我目前能想到的最好的方法是使用函数 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]

I don't think there's any good built-in solution for this situation. The best one I can think up at the moment is to create two nested loops to compare all the rows of each cell array, using the function ISEQUAL to do the comparisons:

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

The result will be a set of match indices in the N-by-1 vector index, where N is the number of rows in cell1. If a row of cell1 can't be matched to the data in any row of cell2, then the corresponding entry of index will be 0. Indices of matches in index will preserve the original order of the data in cell1. Also, this code ignores multiple matches in cell2, returning only the index of the first match found and breaking the inner loop (which will potentially reduce the number of iterations needed).

Now you can index into cell2 to get the data corresponding to what's in cell1:

>> cell2(index,:)

ans = 

    'netincome'    [1751]    [1]
    'equity'       [3501]    [2]
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文