1

所以我有一个这种格式的矩阵数据:Data = [Date Time Price]

现在我想做的是根据时间绘制价格,但我的数据非常大,并且在同一日期/时间有多个价格的行,例如第一行、第二行

29  733575.459548611  40.0500000000000
29  733575.459548611  40.0600000000000
29  733575.459548612  40.1200000000000
29  733575.45954862   40.0500000000000

我想取相同日期/时间的平均价格,并去掉任何额外的行。我的目标是对值进行线性内插,这就是为什么我必须只有一个时间到一个价格值。

我怎样才能做到这一点?我这样做了(这减少了矩阵,因此它只需要第一行用于重复日期/时间的行)但我不知道如何取平均值

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
4

3 回答 3

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 次或更多的时间重复,请尝试重新考虑如何更改这些步骤。

于 2012-11-13T17:40:55.237 回答
0

[C,ia,ic] = unique(A,'rows')还返回索引向量 ia 和 ic 使得 C = A(ia,:) 和 A = C(ic,:)

A如果您仅将不想平均的列用作输入(此处为:日期和时间),ic则对于要组合的行具有相同值的每一行都有一个值。

从那里到你想要的方式对于 MATLAB 初学者来说可能更直观的for循环:使用逻辑索引,例如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 的不同行的平均权重更大。

于 2012-11-13T17:58:55.440 回答
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
于 2012-11-13T20:39:01.830 回答