【问题标题】:find row number in matlab在matlab中查找行号
【发布时间】:2012-08-22 22:40:07
【问题描述】:

从下面的例子:

x = 1 + (10-1)*rand(1,100);
x(12:22) = 20 + (30-20)*rand(1,11);
x(70:94) = 20 + (30-20)*rand(1,25);

我在这里尝试了几件事。首先,我试图找到大于 20 的第一个值的行号,其中连续值 >20 的数量大于 24。所以在此示例中,我想返回行号 70。

我可以这样做:

y = x > 20;
k = [strfind([~y(1),y],[0 1]);strfind([y,~y(end)],[1 0])];
idx = k(1,diff(k) + 1 > 24);

但是,我还想将第一组值(不包括超过 24 个 > 20 的连续值)替换为 nan。我怎样才能做到这一点?

【问题讨论】:

  • 你的行 k = [strfind([~y(1),y],[0 1]);strfind([y,~y(end)],[1 0])]; 出现 horzcat 错误。
  • 请查看修改后的问题。需要转置的向量。

标签: matlab


【解决方案1】:

你已经有一个很好的解决方案来查找idx,也许 find 更适合,我不知道:

y = x > 20;
kstart = find(diff([0 y])==1);
kend   = find(diff([y 0])==-1);
klen   = kend-kstart+1;

idx = kstart(find(klen>=24,1,'first')); %*

*是的,我知道你可以省略'first',但为了清楚起见,它在那里。


无论如何:要替换第一组值(具有index<idx 的值),请使用:

x(1:idx-1) = NaN;

或者,如果您只想替换 idx 之前大于 20 的所有数字:

x(y(1:idx-1)) = NaN;

【讨论】:

  • 为什么是1:idx-1?不应该像 OP 想要的那样是 kstart(idx):kend(idx) 吗?
  • @EitanT kstart(idx):kend(idx) 没有任何意义,因为idx 是原始数据向量的索引,而kstartkend 也是原始向量的索引。我将 OP 的问题读为:将不包含大于 20 的 24 个连续数字的整组值(在向量的开头)设置为 NaN,请参阅我的编辑以获取另一种解释...
  • 出于某种原因,我认为idxfind 的结果,但现在我看到它是kstart 的子集。无论如何,我相信 OP 想要将不长于 24 的 x>20 的第一个序列替换为NaN,因此基于此,即使被接受,您的答案仍然存在缺陷。 ..
  • @EitanT 这仍然取决于你如何定义set;在 OP 的示例中,idx 之前只有一个连续系列,所以是的,没有区别。而且我的答案是OP的意图......当然因为这个问题将是微不足道的,因为她已经在变量k中拥有系列x>20的起点和终点@
  • 如果它是微不足道的,因为开始和结束是已知的,那么你解释的答案也是微不足道的。也许我只是过度分析了它,IDK。无论如何,您的答案值得 +1。
【解决方案2】:

我想要一套已经很好的解决方案。

你也可以使用卷积:

tmp = conv(x>20, ones(1,25));
inds = find(tmp==25)
first_indes = inds(1);

【讨论】:

    【解决方案3】:

    至于你的问题的第一部分,这里是查找 all 25 个或更多连续出现大于 20 的元素的索引:

    idx = strfind((x(:)' > 20), ones(1, 25));
    

    使用idx(1) 获取第一个索引,在您的示例中为 70。

    至于你问题的第二部分,这里有一个解决方案:

    idx_start = strfind([0, x(:)'] > 20, [0 1]);           %# Start indices
    len = strfind([x(:)' > 20, 0], [1 0]) - idx_start + 1; %# Sequence lengths
    first = find(len < 25, 1);                             %# First desired sequence
    x(idx_start(first):idx_start(first) + len(first) - 1) = NaN;
    

    请注意,这仅替换 x > 20 的第一个次连续出现,即不超过 24。

    【讨论】:

    • @GuntherStruyf 感谢您的评论,已修复。
    猜你喜欢
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 2014-07-13
    • 2014-02-16
    • 2015-08-24
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    相关资源
    最近更新 更多