所以我有这种格式的矩阵数据: 数据= [日期时间价格]
现在我要做的是绘制价格与时间的关系,但我的数据非常大,并且有相同日期/时间有多个价格的行,例如第1行,第2行
29 733575.459548611 40.0500000000000
29 733575.459548611 40.0600000000000
29 733575.459548612 40.1200000000000
29 733575.45954862 40.0500000000000
我想以相同的日期/时间取平均价格,并删除任何额外的行。我的目标是对值进行线性内插,这就是为什么我必须只有一个时间到一个Price值。
我该怎么做?我做了这个(这减少了矩阵,所以它只占用重复日期/时间的行的第一行),但我不知道如何取平均值
function [ C ] = test( DN )
[Qrows, cols] = size(DN);
C = DN(1,:);
for i = 1:(Qrows-1)
if DN(i,2) == DN(i+1,2)
%n = 1;
%while DN(i,2) == DN(i+n,2) && i+n<Qrows
% n = n + 1;
%end
% somehow take average;
else
C = [C;DN(i+1,:)];
end
end
答案 0 :(得分:0)
尝试以下方法:
[Qrows, cols] = size(DN);
% C is your result matrix
C = DN;
% this will give you the indexes where DN(i,:)==DN(i+1)
i = find(diff(DN(:,2)==0);
% replace C(i,:) with the average
C(i,:) = (DN(i,:)+DN(i+1,:))/2;
% delete the C(i+1,:) rows
C(i,:) = [];
希望这有效。 如果重复的时间值成对出现(平均值在i和i + 1之间计算),这应该有效。如果时间重复为3或更多,请尝试重新考虑如何更改这些步骤。
答案 1 :(得分:0)
[C,ia,ic] = unique(A,'rows')
also returns index vectors ia and ic 这样C = A(ia,:)和A = C(ic,:)
如果您将输入A
仅用作您不希望平均的列(此处为:日期和时间),ic
为您想要合并的行的每一行都设置一个值相同的价值。
通过for
循环,对于MATLAB初学者来说,从那里到达你想要的手段可能更直观:使用逻辑索引,例如: DN(ic==n,3)
您获得了要平均的所有值的向量(其中n
是它所属的日期时间行的索引)。您需要为所有不同的日期时间组合做到这一点。
更加面向矢量的方式是使用accumarray
,这会导致您的问题解决方案分为两行:
[DateAndTime,~,idx] = unique(DN(:,1:2),'rows');
Price = accumarray(idx,DN(:,3),[],@mean);
我不太确定你希望结果如何,但[DataAndTime Price]
再次为你提供输入的三行格式。
请注意,如果您的输入包含以下内容:
1 0.1 23
1 0.2 47
1 0.1 42
1 0.1 23
然后在上述行之前将unique(...,'rows')
应用于输入的结果将为1 0.1
提供与直接使用上述结果不同的结果,因为后者将计算23,23和42的平均值虽然在前一种情况下,一个23将被删除之前的重复,而42的不同行将在平均值中具有更大的权重。
答案 2 :(得分:0)
这样的东西可行,但我没有运行代码所以我不能保证没有错误。
newX = unique(DN(:,2));
newY = zeros(1,length(newX));
for ix = 1:length(newX)
allOcurrences = find(DN(:,2)==DN(i,2));
% If there's duplicates, take their mean
if numel(allOcurrences)>1
newY(ix) = mean(DN(allOcurrences,3));
else
% If not, use the only Y value
newY(ix) = DN(ix,3);
end
end