2017-10-14 11 views
0
k=3000 
UnqLab = unique(TrainingLabels) 
n = length(UnqLab) 
count=hist(TrainingLabels,UnqLab); 
num = 1; 
for i = 1:n 
    fprintf('\n %i',i) 
    nn = count(i) 
    for j = 1:nn 
     NTrainingFeatures(num,:) = TrainingFeatures(num,ranking(i,1:k)) 
     num = num +1; 
    end 
end 

ここでTrainingLabelsのサイズは21,000 * 1で、ソート順に257個のラベルが含まれています。例えば、001,001,001,001,001,001 ..... 002,002,002 ....... 257,257。このMATLABコードの計算時間を短縮できますか?

トレーニングフィーチャーは、値が21,000 * 4096のものがあります。

ランクのサイズは257×4096です。 ランキングには、ランク(たとえば、3076,456,765,4000,87,5、.....)が含まれています。これは、最初の行がどのように見えるかです。これは、TrainingFeaturesの3076年のすべての最初のラベルの入力が第1位になったことを意味します。

このコードでは計算量が多すぎます(日単位)。少し時間がかかるようにすることができますか? MatlabまたはPythonのコードが動作します。

答えて

0

一般に、MATLABではループを避けたいと考えています。特に、あなたの最大の問題はあなたの内部ループだと思われます。項目のうちcount(i)を実行する代わりに、ブロック全体を一度にコピーするほうが速くなります。毎回同じサイズのTrainingFeaturesのチャンクを取っているようです(iもkもループ依存ではありません)。だから、私は間違いなく適切に必ずすべてのラインを作るために(おそらく、あなたのデータを以下の行列のサブセットに)これを試すだろう

NTrainingFeature(num:num+count(i),:) = TrainingFeatures(num:num+count(i),ranking(i,1:k)); 
num = num + count(i) + 1; 

ような何かを行うことができるはずです。テストするコードにアクセスすることができなければ、インデックスを設定する際に間違いをしているか、マトリックスの形が一致していない可能性があります。行列のインデックスと図形の整列がうまくいかない場合は、reshape()を使用するか、単一インデックス呼び出しを使用してみてください。

+0

あなたが役に立ったと答えた場合は、その回答を受け入れることをお勧めしますか? – Mozglubov

+0

新しいここに..それはまたオプションであることを知らなかった。 – AAA

+0

心配する必要はなく、誰の検索でも問題が解決した場合に質問に答えたことを示すのに役立ちます。スタックオーバーフローへようこそ! – Mozglubov

関連する問題