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は(:)
のようですが、それをベクトルに行単位で取得することができます! ありがとう
私はこのようなことも考えていました。私はFortranのようにMATLABがデータを大きな列形式でメモリに保持していることを知っていました。http://en.wikipedia.org/wiki/Row-major_order#Column-major_order、しかし、それでも何らかの形でベクトルに変換することが可能になると考えていたのです – tim
@bjoernメモリ内の要素を交換する必要はありません。 – Shai