3

MATLABで、異なる周波数で測定されたデータの2つの行列を組み合わせて、結果がより高い周波数でインデックス付けされるようにするにはどうすればよいですか?より低い周波数で測定されたデータは結果に多くの未知の値を含むので、それらをマトリックスの最後の既知の値に置き換えたいと思います。データがたくさんあるので、ベクトル化されたソリューションが好まれます。以下にサンプルデータを追加しました。

与えられた:

    index1  data1  index2  data2
    1       2.1    2       30.5
    2       3.3    6       32.0
    3       3.5    9       35.0
    4       3.9    13      35.5
    5       4.5    17      34.5
    6       5.0    20      37.0
    7       5.2    ...     ...
    8       5.7
    9       6.8
    10      7.9
    ...     ...

結果:

    index1  data1  data2
    1       2.1    NaN
    2       3.3    30.5
    3       3.5    30.5
    4       3.9    30.5
    5       4.5    30.5
    6       5.0    32.0
    7       5.2    32.0
    8       5.7    32.0
    9       6.8    35.0
    10      7.9    35.0
    ...     ...    ...

編集: 次の投稿は私が必要としているものに近いと思いますが、私の問題に合うようにソリューションを変換する方法がわかりません。 http://www.mathworks.com/matlabcentral/newsreader/view_thread/260139

編集(数ヶ月後): 私は最近、この投稿にたどり着いた人に役立つと思うこの優れた小さな関数に出くわしました:

function yi = interpLast(x,y,xi)
%INTERPLAST Interpolates the input data to the last known value.
% Note the index data should be input in ASCENDING order.
inds = arrayfun(@findinds, xi);
yi = y(inds);

function ind = findinds(val)
    ind = find(x<=val,1,'last');
    if isempty(ind)
        ind = 1;
    end
end

end

クレジットはここにあります:http://www.mathworks.com/support/solutions/en/data/1-48KETY/index.html?product = SL&solution = 1-48KETY

4

2 に答える 2

3

問題は、ランレングスデコードの1つです。Matlabアレイ操作のヒントとコツのセクション15.5.2を参照してください(これは、Matlab愛好家にとって目を見張るような読み物です)。

これがあなたの例でメソッドを使用しています(私はオクターブを使用していますが、コードはMatlabと同じです):

octave:33> a=[2,30.5;6,32;9,35;13,35.5;17,34.5;20,37]
a =

    2.0000   30.5000
    6.0000   32.0000
    9.0000   35.0000
   13.0000   35.5000
   17.0000   34.5000
   20.0000   37.0000

octave:34> i=a(:,1)-1
i =

    1
    5
    8
   12
   16
   19

octave:35> j=zeros(1,i(end))
j =

   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

octave:36> j(i(1:end-1)+1)=1
j =

   0   1   0   0   0   1   0   0   1   0   0   0   1   0   0   0   1   0   0

octave:37> j(1)=1
j =

   1   1   0   0   0   1   0   0   1   0   0   0   1   0   0   0   1   0   0

octave:38> val=a(:,2)
val =

   30.500
   32.000
   35.000
   35.500
   34.500
   37.000

octave:39> x=val(cumsum(j))
x =

   30.500
   32.000
   32.000
   32.000
   32.000
   35.000
   35.000
   35.000
   35.500
   35.500
   35.500
   35.500
   34.500
   34.500
   34.500
   34.500
   37.000
   37.000
   37.000

そして、必要に応じて最初にNaNを埋め込みます。

于 2012-09-29T00:10:33.423 に答える
2

最近、あなたと同じ問題が発生しました。さまざまなシステムで測定されたデータがあり、同期して処理する必要がありました。

私の解決策は、測定データと時間情報(頻度、測定開始時の時間)をクラスオブジェクトに入れることで構成されていました。次に、そのクラスに乗算、加算などのメソッドを実装しました。このメソッドは、必要なすべてのものを自動的に処理します。

  • 低周波数信号のアップサンプリング(線形補間(interp1 )を使用)
  • 信号の1つをシフトして、データが時間内に整列するようにします
  • 重複しないデータセットを最初と最後で切り取ります(2つの異なるシステムでは、同時に測定を開始または停止することはないため、余分なデータがあります)
  • 実際に乗算を実行します
  • 結果を新しいクラスオブジェクトとして返します

その隣には、それらが何をするかを推測できる他の関数がありました:plot、lpf、mean、getTimeAtIndex、getIndexAtTime、...

これにより、私は簡単に行うことができました

signalsLabview = importLabViewSignals(LabViewData);
signalsMatlab = importMatlabSignals(MatlabData, 100); %hz

hydrPower = signalsLabview.flow * signalsMatlab.pressure;
plot(hydrPower);

またはそのようなもの。いくつかの計算をしなければならないこれらの信号がたくさんある場合、これは本当に役立ち、明確なコードになります。それ以外の場合は、各操作の同期、シフト、トリミングを行うためだけの一般的なコードがたくさんあります。また、物事をすばやくチェックするのも簡単です。

これをたくさんやらなければならないのなら、適切なフレームワークを構築するために時間をかける価値があると思います。

残念ながら、このコード(IPなど)を開示することはできないと思いますが、それはロケット科学ではありませんでした。

于 2012-09-29T07:30:14.017 に答える