2016-04-18 8 views
1

のベクトルの速い作成は、私は、変数distr=[0 3 1 0 2];を持っている、と私はすべてのiため、distr(i)iをcontrainすべき変数fullを持っています。この例ではMATLAB:インデックス

、私はしたい:

full=[2 2 2 3 5 5]; 

ので3倍2、というように、distr(2)=3ので。

私は for -loopでそれを行うことができます。もちろん、

full=zeros([1,sum(distr)]); 
cc=1; 
for i=1:length(distr) 
    curr=distr(i); 
    full(cc:cc+curr-1)=i*ones([1,curr]); 
    cc=cc+curr; 
end 

が、それは非常に遅いです。 MATLABの優れた配列指向のスタイルを使って、高速な方法を知っていますか?ありがとう!

+1

__run-length decoding__が必要です。次のように 'repelem'を使います:' result = repeatlem(1:numel(distr)、distr); '。または、他のアプローチについてのリンクされた質問と回答を参照してください。 –

+0

ああ、それは正しい名前です、私はこのプロパティを呼び出す方法を知らなかったので、結果を見つけることができませんでした。ありがとう、それは、特にパフォーマンステストに役立ちます! – NicoDean

答えて

2

わかりませんが、これはうまくいくでしょう。私は現在、MATLABを持っていないのでチェックできません:

full_tmp = arrayfun(@(i,n) i*ones(1,n),1:length(distr),distr,'uniformoutput',false); 
full = cat(2,full_tmp{:}); 
+0

ああそうです:)ありがとうございます! – NicoDean

関連する問題