【问题标题】:Finding the column index given the contents in a cell array给定元胞数组中的内容查找列索引
【发布时间】:2015-09-15 15:21:17
【问题描述】:

当给定 2 行元胞数组中的 2 行值时,我试图弄清楚如何获取列索引。

我不知道为什么我很难弄清楚这一点,因为您可以轻松找到 1 列值。

例如,给出下面的元胞数组:

{1,1,1,2,2,2;'apple','banana','orange','apple','banana','orange'}.'

我想找到 column1 = 2 和 column2 = 'banana' 的位置

输出应该是 5。

我该怎么做?

【问题讨论】:

  • 那是元胞数组对吗?
  • 这看起来像是一个一维元胞数组。我认为您的意思是二维矩阵/单元阵列
  • 你肯定是指{1,1,1,2,2,2;'apple','banana','orange','apple','banana','orange'}.'。请相应地编辑问题
  • @LuisMendo 是的,对不起。我的意思是单元格数组

标签: matlab matrix vector cell-array


【解决方案1】:

根据@LuisMendo,我将假设一个元胞数组

cellarray = {1,1,1,2,2,2;'apple','banana','orange','apple','banana','orange'}.';
values = cell2mat(cellarray(:,1));
tmp1 = values == 1;
tmp2 = strcmp('banana', cellarray(:,2));
tmp3 = tmp1+tmp2;
result = find(tmp3 == 2);

这将从元胞数组中获取值,然后搜索所有等于1 的值。然后它使用strcmp 查找与'banana' 匹配的所有匹配项,并将该结果添加到通过值获得的逻辑数组中。最后,它搜索两个实例都为真的地方,即tmp3 等于2

哇哦!我的第一个打高尔夫球的班轮。 59、51 字节!

find(((([A{:,1}])==1)'+strcmp('banana',A(:,2)))==2)
 =
         2

【讨论】:

  • 您的意思可能是values = cell2mat(cellarray(:,1))。或values = [cellarray{:,1}]
  • @LuisMendo 我确实做到了。但是,无法以这种方式获取字符串,给了我一个 CAT 错误
  • 是的,您需要将字符串保留为元胞数组,因为它们的长度可能不同。但是strcmp 会查看单元格的内容,因此您可以使用它来比较字符串的单元格数组和字符串
  • 非常感谢。正是我想要的。
  • @Adriaan 我无法运行 tmp3 = tmp1+tmp2;由于矩阵尺寸不匹配。
【解决方案2】:

如果你喜欢code-golfing -

find([A{1,:}]==2 & ismember(A(2,:),'banana'))

示例运行 -

>> A
A = 
    [    1]    [     1]    [     1]    [    2]    [     2]    [     2]
    'apple'    'banana'    'orange'    'apple'    'banana'    'orange'
>> find([A{1,:}]==2 & ismember(A(2,:),'banana'))
ans =
     5

【讨论】:

  • 现在在 7 个字符以内,差不多了!
  • @Adriaan 怎么样,用strcmp 替换ismember?我不想用那个,因为你做了:)
  • 再说一次,我永远不会使用&,但总是使用&&。可能是因为 MATLAB 一直告诉我,可能是因为我喜欢在视觉上分离这两个变量
  • 检查过,strcmp 要求您转置任一数组。因此,strcmp' 是 7 个字符,ismember 是 8 个字符。没有那么大的改进
猜你喜欢
  • 2017-04-14
  • 1970-01-01
  • 2015-07-29
  • 2017-08-16
  • 1970-01-01
  • 1970-01-01
  • 2016-06-18
  • 2015-04-23
  • 1970-01-01
相关资源
最近更新 更多