Matlab:无法用重复的x值绘制时间序列。如何摆脱重复的行?

时间:2012-11-13 16:23:53

标签: matlab rows average

所以我有这种格式的矩阵数据: 数据= [日期时间价格]

现在我要做的是绘制价格与时间的关系,但我的数据非常大,并且有相同日期/时间有多个价格的行,例如第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

3 个答案:

答案 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