这可能是一项简单的任务,但作为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和编程有更好的了解,我相信我可以使用之前的建议。 对不起,所有的烦恼!
答案 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
我认为一些边界条件会破裂,但除此之外,这就是你想要的吗?