MATLAB:矩阵到行向量

tim*_*tim 7 matlab row vector matrix reshape

如何有效地将矩阵转换为行向量.例:

>> a = [1 2; 3 4]

a =

     1     2
     3     4
Run Code Online (Sandbox Code Playgroud)

(:)符号给我:

>> a(:)

ans =

     1
     3
     2
     4
Run Code Online (Sandbox Code Playgroud)

但我希望得到这样的结果:

>> b = a'; b(:)

ans =

     1
     2
     3
     4
Run Code Online (Sandbox Code Playgroud)

换位和附加的var-assignment使得它慢得多.我可以通过重塑这样的方式完成任务:

>> reshape(a',4,1)

ans =

     1
     2
     3
     4
Run Code Online (Sandbox Code Playgroud)

这比前一个快一点,见板凳:

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
Run Code Online (Sandbox Code Playgroud)

如果我离开转置它会非常快,(:)语法将快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
Run Code Online (Sandbox Code Playgroud)

这就是为什么我问是否有这样一个很好的语法,(:)但要将它按行排序到矢量!?谢谢

Sha*_*hai 3

想想元素在内存中是如何组织的。它们的“自然”顺序是按列排列的。因此A(:),只需更改矩阵的标头,而无需更改存储元素本身的存储器中的任何内容。但是,当您转置 时A,您需要重新排列内存中的元素(复制和交换),这需要时间。