2013-12-15 47 views
7

効率的に行列をベクトルに変換する方法 例:(:)表記が私に与えMATLAB:行列から行ベクトルへ

>> a = [1 2; 3 4] 

a = 

    1  2 
    3  4 

>> b = a'; b(:) 

ans = 

    1 
    2 
    3 
    4 

移調や追加のVAR-割り当てはそれを作る:

>> a(:) 

ans = 

    1 
    3 
    2 
    4 

は、私は、このように結果を取得したいですはるかに遅い。 私はこのようなリシェイプを経由して割り当てずにそれを行うことができます:

>> reshape(a',4,1) 

ans = 

    1 
    2 
    3 
    4 

非常に小さなビットより速く、前の1、その後である、ベンチを参照してください。私は離れて残している場合

runs = 1000; 
num = 1000; 
A = rand(num); 

times = zeros(runs, 2); 
for i = 1:runs 
    tic 
    x = A'; 
    x = x(:); 
    t1 = toc; 
    x = reshape(A',size(A,1)*size(A,2),1); 
    t2 = toc-t1; 
    times(i,:) = [t1 t2];  
end 
format shortG 
mt = mean(times) 

mt = 

    0.0037877 0.0037699 

を転置それは非常に非常に高速になると(:)構文は> 100%速く、次のようになりますように素敵なsyntaがあるかどう私が求めている理由です

runs = 100; 
num = 5000; 
A = rand(num); 

times = zeros(runs, 2); 
for i = 1:runs 
    tic 
    x = A(:); 
    t1 = toc; 
    x = reshape(A,size(A,1)*size(A,2),1); 
    t2 = toc-t1; 
    times(i,:) = [t1 t2];  
end 
format shortG 
mt = mean(times) 

mt = 

    3.307e-07 8.8382e-07 

xは(:)のようですが、それをベクトルに行単位で取得することができます! ありがとう

答えて

3

要素がメモリ内でどのように構成されているかを考えてみましょう。彼らの "自然な"命令は列方向です。したがって、A(:)は単に行列のヘッダーを変更しますが、ではありません。は、要素自体を格納するメモリ内のエンティティを変更する必要があります。しかし、Aを転記するときは、要素をメモリ内に再配置する必要があり(コピーとスワッピング)、時間がかかります。

+0

私はこのようなことも考えていました。私はFortranのようにMATLABがデータを大きな列形式でメモリに保持していることを知っていました。http://en.wikipedia.org/wiki/Row-major_order#Column-major_order、しかし、それでも何らかの形でベクトルに変換することが可能になると考えていたのです – tim

+1

@bjoernメモリ内の要素を交換する必要はありません。 – Shai

関連する問題