【问题标题】:find index of a specific number row wise逐行查找特定数字的索引
【发布时间】:2016-06-10 01:16:11
【问题描述】:

考虑下面的例子

A =

     6     9     4     7    10
     3     6     5     5     9
    10     4     9     8     6
    10     6     3     4     6
     6     3     3     8     6
     6     4     4     4     5
     5    10     8     5     7
    10    10     8     8     7
     5     7     8     9     9
     3     3     6     3     9

[~,Inx] =max(A, [],2)

Inx =

     5
     5
     1
     1
     4
     1
     2
     1
     4
     5

上面的代码返回每列最大数量的索引,就像第一行一样,第五行的最大数量是 10 所以Inx(1) = 5 我们可以为 find 做同样的事情吗?例如,如果我想在每一行中找到一个特定的数字让我们说 8

>> find(A == 8)

ans =

    27
    28
    29
    33
    35
    38

我会得到索引,但不会像我们为max() 得到的那样逐行获取有没有办法做 minipulate find 得到那个?或者其他方式

更新:我知道我们可以使用[row,col,v] = find(___),但有一个问题是它只返回存在值的行

【问题讨论】:

  • 你希望它在值不存在的地方返回什么?我有点困惑你到底在追求什么……
  • 喜欢它应该返回 0 或者一个 nan 代替它
  • 啊哈,所以对于每个,你想检查是否有一个数字,如果没有它应该返回0?如果你真的想要这个,我建议你考虑一下,如果你尝试使用这些索引,你会得到错误......
  • 是的,就像它存在列号一样,否则为 0
  • 重塑为向量并使用sub2ind,然后您可以检查是否缺少条目

标签: matlab


【解决方案1】:

您可以简单地将A 转换为逻辑矩阵,如果等于1,则为1,否则为0。然后您可以使用max 的第二个输出来查找每行中包含第一个8 的列。如果一行不包含任何8,则max 的第一个输出将是0,第二个输出将是1。 您可以将第一个和第二个输出相乘以将这些没有8 的行清零。

[has8, col] = max(A == 8, [], 2);

% Zero out any rows that didn't contain an 8
result = has8 .* col;

%   0
%   0
%   4
%   0
%   4
%   0
%   3
%   3
%   3
%   0

如果你宁愿拥有NaN而不是0,你可以利用0/0 == NaN这一事实进行以下操作

result = has8 .* col ./ has8;

%   NaN
%   NaN
%     4
%   NaN
%     4
%   NaN
%     3
%     3
%     3
%   NaN

【讨论】:

  • 完美就是我想要的:)
  • 感谢更新,让大家更容易理解了
【解决方案2】:
Inx = zeros(size(A,1),1); % initialize with default values
[row,col,v] = find(A==8); % find the proper indices
Inx(row) = col; % insert values

【讨论】:

  • 它与使用 [row,col,v] = find(___) :) 相同
猜你喜欢
  • 1970-01-01
  • 2018-11-22
  • 2023-04-02
  • 2016-01-05
  • 2020-01-25
  • 2011-07-04
  • 2018-04-24
  • 2022-11-02
  • 2012-02-24
相关资源
最近更新 更多