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
, вам нужно переупорядочить элементы в памяти (копирование и замена), и это требует времени.