Как эффективно преобразовать матрицу в векторный ряд. Пример: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
Да, я тоже думал об этом, так как знал, что MATLAB, как и fortran, хранит данные в памяти в основном формате колонки http://en.wikipedia.org/wiki/Row-major_order#Column-major_order, но все же подумал, что можно будет как можно быстрее преобразовать в вектор – tim
@bjoern. Я полагаю, что нет необходимости менять элементы в памяти. – Shai