2017-05-20 8 views
1

私は1200000行と18列の行列を持っています。交通データであり、各行は一意であり、第1列は「車両ID」であり、第2列は「フレームID」であり、第16列は「フロント車両ID」である。私は、MATLABが同じフレームIDのデータ全体からフロント車両の行ベクトルを見つけ、それをPVと呼ばれる別の行列に配置します。また、前方に車がない場合は、ゼロベクトルを配置します。行列全体を「H1」といいます。私は以下のコードを使用し、作業にはパーセンテージを使用しました。ただし、実行時間が遅すぎるため、16GBのメモリで14時間以上かかります。他の10のデータがあるので、それは私にとっては長すぎます。それをより速くより良くするために私を助けてください。このMATLABコードをループ内で高速化する方法はありますか?

ありがとうございます。

for i=1:1200000 
    i*100/m   % Shows what percent of the work done 
    g = H1(H1(:,1)==H1(i,16),:);   
    g = g(g(:,2)==H1(i,2),:); 
    if isempty(g)==1 
     PV(i,:) = zero(1,:); 
    else 
     PV(i,[1:17])=g(1,[1:17]); 
    end 
end 

EDIT:データは10000ページで本のようです。各ページはフレームID(ページ番号はフレームID)であり、車内に多数の車両があり、固有の車両IDを持ちます。だから、どのページにも上から撮ったイメージがあり、このイメージの中にはたくさんの車があります。 0.1秒の時間間隔で画像を貼り合わせると、車両の走行フィルムが得られます。このデータには、MATLABの "plot"コマンドを使用して各フレームを描画できる車両のx座標とy座標が含まれます。このデータには、各行の16桁目のIDを持つ先行車両(自車両前方の車両)も含まれる。すべての車両の情報がデータに含まれていることに注意してください。自車の前方に車両が存在しない場合、第16列の数字は0である。したがって、どの列にも1台の車両の情報しか表示されません。データは、フレームIDに関してソートされる。

ここでは、先行車両の行を行列全体から抽出し、PVの行列に配置する必要があります。問題は、パーセンテージが約5%になるとゆっくりと変化することです。ここで、データのサンプルである:

[629 2033...581] 

最初の列は、第二は、フレームID及び16は、このフレームIDに先行車のIDであり、車両のIDです。ここでは、車番号581が2033のフレームIDの車番号629の前にあります。今度は、フレーム2033で車両ID 581のデータを抽出し、PV行列に配置する必要があります。

その他のサンプル:最初は車両ID、2番目はフレームID、3番目の番号は先行車両IDです。

[629 2033 688 1113433338200 28.703 462.09 6042802.932 2133529.776 56.3 7.9 3 12.8 5.09 3 581 640 95.39] 
[577 2033 465 1113433338200 79.392 618.232 6042833.946 2133691.06 17.3 8.4 2 30.19 -0.37 7 0 3362 0] 
[580 2033 621 1113433338200 53.4 542.455 6042817.601 2133612.708 18.3 7.5 2 20.49 -0.09 5 572 3361 80.9] 
[581 2033 565 1113433338200 27.252 557.481 6042789.779 2133624.359 16.8 7.4 2 21.25 4.19 3 573 629 62.54] 

ご説明いただきありがとうございます。

私たちは、まずフレームごとにコードを適用する1つのセル配列に、各フレームのIDを抽出する必要があります:私は答えを見つけた他人の助けを借りて

+0

長さ(ユニーク(H1(:1)))は何を返しますか? – grantnz

+0

実際のデータを添付できますか?それは人々が答えを公式化するのを助けるかもしれない。 – m7913d

+0

_frame ID_でデータをソートすることによって、同じ_frame ID_を持つ行を1回だけ抽出すると便利です。 – m7913d

答えて

2

このコードはフレームを分割します。次にこれが適用されます:

for j=1:10000 
    m = size(F{1,j},1); 
    for i=1:m 
     i*100/m   % Shows what percent of the work done 
     g = F{1,j}(F{1,j}(:,1)==F{1,j}(i,16),:); 
     if isempty(g)==1 
      F{1,j}(i,[18:34]) = zero(1,:);   % Preceding vehicle 
     else 
      F{1,j}(i,[18:34]) = g(1,[1:17]); 
     end 
    end 
end 

ありがとうございました。 @hypfcoと@ m7913d

関連する問題