【问题标题】:Extract values from rows satisfying a given criteria从满足给定条件的行中提取值
【发布时间】:2018-03-02 19:38:21
【问题描述】:

我想每 30 分钟计算一次商店的总收入,

我有一个像这样的数据集:

hour  minute   price

0      1        12,5
0      1        10
0      2        15
0      3        15

我尝试过这样实现总计:

[rows,cols,vals] = find(0 < data(:,2) &  data(:,2) < 31 );

但无法得到我想要的。

【问题讨论】:

    标签: matlab find accumarray


    【解决方案1】:

    您应该使用逻辑索引来获取 30 分钟范围内的价格:

    data(0 < data(:,2) &  data(:,2) < 31, 3)
    

    为什么 find 不符合您的预期?

    find 作用于以下表达式0 &lt; data(:,2) &amp; data(:,2) &lt; 31 的结果,即[1 1 1 1].' 它对原始矩阵data 一无所知。因此,在这种情况下,第二个和第三个参数是没有用的。它们对于获取nonzero elements in a matrix 很有用。

    作为逻辑索引的一种(效率较低的)替代方案,您可以获得相同的结果,如下所示:

    data(find(0 < data(:,2) &  data(:,2) < 31 ), 3)
    

    选择特定时间

    目前,您选择每小时前半段的价格。例如,要选择 00:00 到 00:30 之间的价格,您可以使用以下命令:

    data(data(:,1) == 0 && 0 < data(:,2) &  data(:,2) < 31, 3)
    

    【讨论】:

    • 感谢您的快速回答,但我无法正常工作,因为它会在第 2 小时、第 3 小时、第 4 小时返回值……以此类推。我想在 00:00 - 00:30、00:30-1:00、1:00 - 1:30 .... 之间添加值
    • 当然你应该在第一列添加一个附加条件。
    【解决方案2】:

    我找到了解决办法

    data(:,2) =((data(:,2) ./ 30) + 1);
    data(:,2)= floor(data(:,2));
    changes = find(diff(data(:,2)))+1;
    
    for i=1:1:(length(changes) -1)
    A(i)=sum(data(changes(i):changes(i+1),3))
    end
    

    【讨论】:

      猜你喜欢
      • 2011-10-02
      • 1970-01-01
      • 1970-01-01
      • 2020-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多