1

だから私はこの形式の行列データを持っています: データ = [日時価格]

今私がしたいことは、時間に対して価格をプロットすることですが、私のデータは非常に大きく、同じ日付/時間に対して複数の価格がある行があります.1行目、2行目など

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

同じ日付/時刻の価格の平均を取り、余分な行を取り除きたいです。私の目標は、値に対して線形内挿を行うことです。そのため、Time to one Price 値は 1 つだけ必要です。

これどうやってするの?私はこれを行いました(これにより、マトリックスが縮小され、日付/時刻が繰り返される行の最初の行のみが取得されます)、平均を取る方法がわかりません

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

このようなものは機能しますが、コードを実行していないため、バグがないことを約束することはできません.

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 に答える
0

[C,ia,ic] = unique(A,'rows') また、 C = A(ia,:) および A = C(ic,:) となるインデックス ベクトル ia および ic も返します。

A平均したくない列 (ここでは日付と時刻) のみを入力として使用する場合はic、結合する行が同じ値を持つすべての行に 1 つの値を使用します。

そこから必要な手段に到達することは、MATLAB の初心者にとっておそらくforループを使用する方が直感的です: 論理インデックスを使用します。たとえばDN(ic==n,3)、平均化したいすべての値のベクトルを取得します (nこれが属する日時行のインデックスはどこにありますか? )。これは、すべての異なる日時の組み合わせに対して行う必要があります。

よりベクトル指向の方法は、 を使用することaccumarrayです。これにより、問題が 2 行で解決されます。

[DateAndTime,~,idx] = unique(DN(:,1:2),'rows');
Price = accumarray(idx,DN(:,3),[],@mean);

結果をどのように表示したいかはよくわかりませんが[DataAndTime Price]、入力の 3 行形式が再び表示されます。

入力に次のようなものが含まれている場合に注意してください。

1 0.1 23
1 0.2 47
1 0.1 42
1 0.1 23

次に、unique(...,'rows')上記の行の前に入力に適用した結果は、上記を直接使用する場合とは異なる結果に1 0.1なります。後者は23、23、および42の平均を計算しますが、前者の場合、1つの23が重複として削除されます前と 42 の異なる行は、平均でより大きな重みを持ちます。

于 2012-11-13T17:58:55.440 に答える