repmat
これは、reshape
桁違いに高速な方法です。
そのようなことを行うための最良の方法の1つは、Tony'sTrickを使用することです。RepmatとReshapeは通常、Matlabs固有のインデックスを直接使用するため、Tonyのトリックよりも遅いことがわかります。あなたの質問に答えるために、
r=[1 2 3]
N
たとえば、行ベクトルの時間を次のようr=[1 2 3 1 2 3 1 2 3...]
に並べて表示したいとします。
c=r'
cc=c(:,ones(N,1));
r_tiled = cc(:)';
reshape
この方法は、大規模なものに対して、またはrepmat
大規模なものに対して大幅な時間の節約になりN
ます。
編集:@Li-aungYipの疑問に返信する
repmat
との間の速度差を確認するために、小さなMatlabテストを実行しましたtony's trick
。下記のコードを使用して、ベースベクトルから同じタイルベクトルを構築するための時間を計算しましたA=[1:N]
。結果は、はい、Tony's-Trickは、特に大きいNの場合、桁違いに高速であることを示しています。人々はそれを自分で試すことができます。このような操作をループで実行する必要がある場合は、この時間差が重要になる可能性があります。これが私が使用した小さなスクリプトです。
N= 10 ;% ASLO Try for values N= 10, 100, 1000, 10000
% time for tony_trick
tic;
A=(1:N)';
B=A(:,ones(N,1));
C=B(:)';
t_tony=toc;
clearvars -except t_tony N
% time for repmat
tic;
A=(1:N);
B=repmat(A,1,N);
t_repmat=toc;
clearvars -except t_tony t_repmat N
両方の方法の時間(秒単位)を以下に示します。
- N = 10、time_repmat = 8e-5、time_tony = 3e-5
- N = 100、time_repmat = 2.9e-4、time_tony = 6e-5
- N = 1000、time_repmat = 0.0302、time_tony = 0.0058
- N = 10000、time_repmat = 2.9199、time_tony = 0.5292
私のRAMは、N=10000を超えることを許可しませんでした。N = 100000の場合、2つの方法の時間差はさらに大きくなると確信しています。これらの時間はマシンごとに異なる可能性があることは知っていますが、時間の大きさの相対的な違いは有効です。また、時間の平均がより良いメトリックであった可能性があることも知っていますが、2つのアプローチ間の時間消費の大きさの違いのオーダーを示したかっただけです。私のマシン/OSの詳細を以下に示します:
関連するマシン/OS/ Matlabの詳細:Athlon i686 Arch、Ubuntu 11.04 32ビット、3GB RAM、Matlab 2011b