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

транспозиция и дополнительное назначение var делают его намного медленнее. Я мог бы сделать это без задания через reshape следующим образом:

>> 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

вот почему я спрашиваю, есть ли такой хороший синтаксис, как (:) но, чтобы получить его по строке к вектору!? Спасибо

1 ответов


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