Jak sprawnie przekształcić macierz w wektor. Przykład:MATLAB: Macierz do wektora wierszowego
>> a = [1 2; 3 4]
a =
1 2
3 4
notacja (:)
daje mi:
>> a(:)
ans =
1
3
2
4
ale chcę, aby uzyskać wynik jak to:
>> b = a'; b(:)
ans =
1
2
3
4
Transpozycja i dodatkowy var przypisanie czyni go znacznie wolniej. mogę to zrobić bez przypisania poprzez przekształcić tak:
>> reshape(a',4,1)
ans =
1
2
3
4
który jest bardzo mały nieco szybciej niż poprzedni, zobaczyć z ławki:
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
Jeśli wyjeżdżam z dala transpozycja byłoby bardzo dużo szybsze i składnia (:)
byłoby> 100% szybciej:
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
dlatego pytam, czy jest taki ładny Synta x lubię (:)
, ale po to, aby uzyskać wiersz zgodny z wektorem !? Dzięki
Tak, myślałem o czymś takim również, ponieważ wiedziałem, że MATLAB, podobnie jak fortran, przechowuje dane w pamięci w głównym formacie kolumnowym http://en.wikipedia.org/wiki/Row-major_order#Column-major_order, ale wciąż myślałem, że w jakiś sposób będzie możliwe przekonwertowanie na wektor szybciej – tim
@ bjoern Przypuszczam, że nie ma potrzeby wymieniania elementów w pamięci. – Shai