【问题标题】:Matlab change all values of a row subsequent to a number in a row going below a thresholdMatlab更改一行中低于阈值的数字之后的所有值
【发布时间】:2013-10-23 04:30:12
【问题描述】:

给定一个矩阵,我想逐行遍历并找到任何低于阈值的值,将其称为 T。在行中的值低于 T 的第一个实例之后,该行中的所有后续卷应该将它们的值更改为 0。这很容易迭代几个循环,但我想通过矩阵运算来做到这一点,因为我有 50k 行和 100 列。

具体来说,我想采用以下 T=.5 的输入矩阵:

1 1 1 1 0 1 1 1 1

1 1 1 1 1 1 1 1 1

1 0 1 1 1 1 1 1 1

并获得以下信息:

1 1 1 1 0 0 0 0 0

1 1 1 1 1 1 1 1 1

1 0 0 0 0 0 0 0 0

任何帮助将不胜感激(再次提醒我想尽可能避免使用循环)

谢谢 瑞恩

【问题讨论】:

  • 您是否希望将低于阈值的第一个值也设置为零?
  • 其实我只是要制作一个全新的矩阵。值可能不同的地方。因此,只要该值高于阈值,就可以说是 C,下面的第一个值是 R,然后是 0。所以对输出矩阵的更好描述是: C C C C R 0 0 0 0 C C C C C C C C C C C R 0 0 0 0 0 0 0
  • 不知道如何在那里制作线条。
  • 在这种情况下,也许这对你有用:cumsum(m < T, 2) + (m < T),这里你的C 是我的0,你的R 是我的2,你的0 是我的@987654327 @?
  • 或者~cumsum(m < T, 2) + 2*(m < T)切换1s和0s

标签: matlab matrix


【解决方案1】:

怎么样:

m(cumsum(m < T, 2)==1) = 0   %// Note that ==1 is the same as just logical(), you can test to see if there is a relevant performance difference for you, otherwise just pick the more readable one

或者,如果您需要将第一个值保留在阈值以下,那么可能:

I = [false(size(m,1), 1) , logical(cumsum(m < T, 2))]
m(I(:, 1:end-1)) = 0

【讨论】:

  • 我必须跑一个小时,但回来时会试试这个。非常感谢您的快速回复!!!
  • 现在看这个。杰出的。我喜欢它。谢谢
  • 很遗憾我不能投票,因为我是新用户。但在精神上,我全心全意地投票。
  • @RyanLewis 没问题 :) 你仍然可以接受它;)如果你真的想的话,你可以随时回来投票
猜你喜欢
  • 1970-01-01
  • 2013-12-21
  • 1970-01-01
  • 2017-07-22
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-06
相关资源
最近更新 更多