【问题标题】:Matlab: Index Vector values identical to fixed valueMatlab:索引向量值与固定值相同
【发布时间】:2014-01-28 16:08:10
【问题描述】:

我有一个 1×1000 的向量,其中包含事件的日期编号,并且我想计算每个日期的总事件数(在此示例中进行了简化)。 dates和events的尺寸一致。

我的代码是

   i = 0
   for d = unique(dates)
      i = i + 1
      result(i) = length(events(d == dates))
   end

我得到d == dates 的尺寸不匹配。我明白为什么(d 是一个 1×1 向量),但我该如何正确写呢?

加分:i 的解决方案非常丑陋...提示?

谢谢!


按要求编辑: dates 包含日期数字

  729028
  729028
  729028
  729028
  729028

而events 包含浮点数:

0.1205
0.2932
2.0384
2.0384
1.0411
0.5425

【问题讨论】:

  • 编辑您的问题以发布dates 和events 的示例定义
  • 谢谢,添加示例!

标签: matlab vector indexing


【解决方案1】:

问题在于unique(dates) 是一个列向量,而for 会遍历等号右侧的列。因此,d 是一个向量,而不是原始代码中的标量。

要得到你想做的代码:

for d = unique(dates)'

为了避免循环:

d = hist(dates,unique(dates));

【讨论】:

  • @LuisMendo:谢谢。有时很有趣,来自不同上下文的函数如何帮助解决问题。 accumarray 原则上也可以提供帮助,但如果数据不是从 1 开始的整数,它就会变得混乱。顺便说一句:在 Matlab 金牌之前只有 78 票!太棒了!
  • 是的,我想到了通常的unique-accumarray 夫妇(@chappjc 非常喜欢,顺便说一句),但这需要明确索引日期。正如你所说,在这种情况下太乱了。 // 嘿,我不记得那个金徽章了……太好了!谢谢:-)
  • 感谢 Jonas 解决阵列问题!猜猜今天早上看了什么...youtube.com/…。直方图不起作用,因为真实数据更复杂(结果有 6 个维度),但我很欣赏这个想法!
【解决方案2】:

您只需要计算dates 的每个值重复了多少次。你可以通过bsxfun 做到这一点:

uniqueDates = unique(dates);
count = sum(bsxfun(@eq, uniqueDates(:), dates(:).'),2);

count的每个条目对应uniqueDates的同索引条目。

例如:dates = [729028; 729028; 729000; 729028; 729100] 的结果是

uniqueDates =
      729000
      729028
      729100

count =
     1
     3
     1

【讨论】:

  • 感谢 Luis 的想法,不幸的是(我的示例去掉了这个事实)真实数据太复杂了,我需要在这些循环中进行更多计算。优雅的解决方案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多