2013-12-15 3 views
7

Как эффективно преобразовать матрицу в векторный ряд. Пример:MATLAB: Матрица в векторный рядный

>> a = [1 2; 3 4] 

a = 

    1  2 
    3  4 

(:) нотации дает мне:

>> a(:) 

ans = 

    1 
    3 
    2 
    4 

, но я хочу, чтобы получить результат, как это:

>> b = a'; b(:) 

ans = 

    1 
    2 
    3 
    4 

Перестановка и дополнительная переменная присваивание делает гораздо медленнее. я мог бы сделать это без присвоения через перекроить так:

>> reshape(a',4,1) 

ans = 

    1 
    2 
    3 
    4 

, который является очень маленьким немного быстрее, чем предыдущий, см скамья:

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% быстрее:

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 

, поэтому я прошу, если есть такая хорошая Synta x как (:), но для того, чтобы получить его по ряду причин к вектору !? Thanks

ответ

3

Подумайте, как элементы организованы в память. Их «естественный» порядок является столбцом. Таким образом, A(:) просто меняет заголовок матрицы, но не необходимо изменить enything в памяти, хранящей элементы сами. Однако, когда вы переносите A, вам необходимо переустановить элементы в памяти (копирование и обмен), и это требует времени.

+0

Да, я тоже думал об этом, так как знал, что MATLAB, как и fortran, хранит данные в памяти в основном формате колонки http://en.wikipedia.org/wiki/Row-major_order#Column-major_order, но все же подумал, что можно будет как можно быстрее преобразовать в вектор – tim

+1

@bjoern. Я полагаю, что нет необходимости менять элементы в памяти. – Shai

Смежные вопросы