Matlab:查找高于150的值并将它们与相应的时间分组

时间:2015-03-05 13:22:59

标签: matlab max

这可能是一项简单的任务,但作为matlab的新手,我无法弄明白。

我有一个带有两个相关列的矩阵,第一列包括一个月内的电力消耗的逐小时测量值(大约740个值)。第二列由对应于每个测量的datenum值组成。

电测量有明显的峰值,我想总结每个峰值,从150的下边界到峰值和"向下"到150再次。每个月大约有10-15个峰值,我想总结每个峰值并将其与相应的时间一起存储在矢量中,以便我可以识别峰值出现的位置以及它们的大小。我能够找到消耗值,但无法从第二列获得相应的时间。

有没有人能解决我如何做到这一点?

对于令人困惑的问题描述感到抱歉。

非常感谢

编辑:

以下是数据中的示例:

0.1250    2.0130    0.0080    0.0030    0.0150         0         0
0.1299    2.0130    0.0080    0.0030    0.0160         0         0
0.1368    2.0130    0.0080    0.0030    0.0170         0         0
0.1333    2.0130    0.0080    0.0030    0.0180         0         0
0.1343    2.0130    0.0080    0.0030    0.0190         0         0
0.1349    2.0130    0.0080    0.0030    0.0200         0         0
0.1250    2.0130    0.0080    0.0030    0.0210         0         0
0.1150    2.0130    0.0080    0.0030    0.0220         0         0
0.1150    2.0130    0.0080    0.0030    0.0230         0         0
0.1000    2.0130    0.0080    0.0040         0         0         0
0.1000    2.0130    0.0080    0.0040    0.0010         0         0
0.0950    2.0130    0.0080    0.0040    0.0020         0         0
0.0900    2.0130    0.0080    0.0040    0.0030         0         0
0.0850    2.0130    0.0080    0.0040    0.0040         0         0
0.0850    2.0130    0.0080    0.0040    0.0050         0         0
0.0848    2.0130    0.0080    0.0040    0.0060         0         0
0.0893    2.0130    0.0080    0.0040    0.0070         0         0
0.0883    2.0130    0.0080    0.0040    0.0080         0         0
0.0817    2.0130    0.0080    0.0040    0.0090         0         0
0.0836    2.0130    0.0080    0.0040    0.0100         0         0
0.0831    2.0130    0.0080    0.0040    0.0110         0         0
0.1017    2.0130    0.0080    0.0040    0.0120         0         0
0.1021    2.0130    0.0080    0.0040    0.0130         0         0
0.0949    2.0130    0.0080    0.0040    0.0140         0         0 

所有值均为1.0e + 03 *

第一个值是消耗值,其余值是每个消耗值的datevec值。我需要能够从第一列中挑选出高于150的值,并将它们与相应的datevec值一起存储。

希望这会有所帮助。我是全新的,对我的“noobish'讯问!

编辑: 我对matlab很新,所以无法让它工作。

要尝试更多"轻松"做法。

我拥有的数据是740x1

数据样本:

94.9997

89.9986

104.9981

139.8430

158.6546

161.6176

169.8047

178.4623

192.4402

207.0930

199.7369

190.2221

181.6872

173.1552

159.8161

149.9443

134.9956

129.9899

114.9989

99.9990

89.9990

89.9991

84.9991

79.9991

79.9989

84.9901

94.9928

149.9995

174.9977

174.7706

179.7816

179.8007

203.4999

208.6901

209.1134

199.3191

183.5979

164.4079

154.8898

140.0000

129.9494

124.9923

124.9987

104.9993

109.9994

94.9995

94.9995

84.9995

84.9995

84.9953

85.0000

84.8889

83.7396

我需要一个程序来遍历数据并选出高于150的数字并对它们进行分组。我意识到我真的不需要时间,我只需要将峰值彼此分开。

我需要它来运行这样的东西:

%for循环数据

%选择超过150的第一组值

%将它们存储在矩阵中:第1列

%选择超过150的下一组值

%将它们存储在同一矩阵中:第2列

%选择超过150的下一组值

%将它们存储在矩阵中:第3列

感谢您的所有帮助,如果我对matlab和编程有更好的了解,我相信我可以使用之前的建议。 对不起,所有的烦恼!

4 个答案:

答案 0 :(得分:0)

确定。

这不太合法......但它可以帮助你开始:

sum = 0; %keeps track of the sum in the interval
max = 0; %keeps track of the peak
maxi = 0; %keeps track of the peak index
aux1 = 1; %aux variable
minv = 100;

for i = 1:length(A)

    if i==1 && A(i,1)<minv

    elseif A(i,1) >= minv
        sum = sum + A(i,1);
        if A(i,1) > max
            max = A(i,1);
            maxi = i;
        end

    elseif A(i,1) < minv && A(i-1,1) >= minv
        B(aux1,1) = sum;
        B(aux1,2:7) = A(maxi,2:7);
        sum = 0;
        max = 0;
        maxi = 0;
        aux1 = aux1 + 1;

    elseif A(i,1) < minv && A(i-1,1) < minv

    end
end

使用您的示例数据运行该代码会产生:

1349.2        2013           8           3          17           0           0
 203.8        2013           8           4          13           0           0

第一列给出了从前100到最后100的总和(我使用100,因为您的数据的值都不大于150,您可以通过更改minv更改此值),其余的列对应于特定时间间隔内峰值的日期和小时,如有必要,您可以添加新列以添加实际峰值。

答案 1 :(得分:0)

您可以使用逻辑索引访问具有高消耗量的正确行。我们假设您的矩阵名称为data

但之前,我会改进数据结构,例如:结构:

% structure data and identify high consumption measurements
measurements.consumption     = data(:,1);
measurements.datevec         = data(:,2:end);
measurements.ixHigh          = measurements.consumption>150;

% get measurements with high consumption
peakMeasurements.comsumption = measurements.consumption(measurements.ixHigh);
peakMeasurements.datevecs    = measurements.datevecs(measurements.ixHigh,:);

如果您很幸运且您拥有Matlab 2013b或更新版本,则可以使用tables来存储您的数据,使其更具人性化。

答案 2 :(得分:0)

使用Matlab功能进行逻辑索引(如JaBe所述)此解决方案应该比循环遍历A(:,:)的所有元素更快

% Generate Demo data
A=[]
A(1:100,1)=20+ (1:100); % Time values
A(1:100,2)=rand(100,1) % scatter
A(20:25,2) = 155 % first peak
A(44:79,2) = 157 % second peak

% Add column with index
Aix=[(1:size(A,1))', A]; % [Index, time, Value]

% Just the peak values
B=Aix(Aix(:,3)>150,:)

% Collection of Peak Values
Peaks = B(1,:)
i_start=B(1,1)
for i=2:size(B,1)
   if B(i,1)==B(i-1,1)+1 % Datapoint belongs to previous peak
       Peaks(end,3) = Peaks(end,3) + B(i,3);   % Sum Value to Peak Result
   else % Generate Dataset for new Peak
       Peaks = [Peaks ; B(i,:)];   % Add new Dataset
   end

end;

disp (' Start Index | Start time | Sum Value')
disp ( Peaks)

将给出以下结果

Start Index | Start time | Sum Value
          20          40         930
          44          64        5652

答案 3 :(得分:0)

让矢量名称为数据。这将为您提供所有峰值的总和:

sumvec = [];
while(1)
    beginindex = find(data>150,1);
    if length(beginindex)==0
        break;
    end
    data = data(beginindex:end);
    endindex = find(data<150,1);
    if length(beginindex)==0
        break;
    end

    sumvec = [sumvec sum(data(beginindex:endindex))];
    data = data(endindex:end);

end

我认为一些边界条件会破裂,但除此之外,这就是你想要的吗?