如何强制向量为行向量?

Mic*_* L. 3 arrays matlab vector

强制任何向量成行向量的最简单方法是什么?

我希望有一些函数将列向量转换为行向量,并保持行向量不变.例如:

A= [1 2 3];
RowIt(A)
Run Code Online (Sandbox Code Playgroud)

将输出行向量:

1 2 3
Run Code Online (Sandbox Code Playgroud)

和:

B= [1; 2; 3];
RowIt(B) 
Run Code Online (Sandbox Code Playgroud)

将输出行向量:

1 2 3
Run Code Online (Sandbox Code Playgroud)

最简单的方法是什么?

Adr*_*aan 10

要使任何向量成为行向量,只需先将其强制为列向量,然后转置它:

A = rand(3,1);
B = A(:).'; % (:) forces it to unwrap along columns, .' transposes
Run Code Online (Sandbox Code Playgroud)

行向量被解包到列向量,然后再次转换为行向量,并且列向量被展开到列向量(因此不会改变),然后转换为行向量.

请注意,由于列展开,任何N维矩阵都会以这种方式强制进入行向量:

A = rand(3,3,3,3);
B = A(:).'; % 81 element row vector
Run Code Online (Sandbox Code Playgroud)


bee*_*eep 7

只需将矩阵/检查器重新整形为一行:

v = reshape(v,1, [])
Run Code Online (Sandbox Code Playgroud)

它还会保留正确形状的矢量不变.

如果你去上面的文档reshape,1意思是1行,并且[]根据需要给出尽可能多的列的大小v.

全功能:

function v = RowIt(v)
    v = reshape(v,1,[]);
end
Run Code Online (Sandbox Code Playgroud)

与@Adriaan回答相比较

Reshape 版:

v = rand(5000*5000, 1);
tic;
for i=1:100000
    b = reshape(v,1, []);
end
toc
Elapsed time is 0.347047 seconds.
Run Code Online (Sandbox Code Playgroud)

(:).'版本: 这个答案

v = rand(5000*5000, 1);
tic
for i=1:100000
    b = v(:).';
end
toc
Elapsed time is 0.082710 seconds
Run Code Online (Sandbox Code Playgroud)

所以@Adriaan的解决方案显然更快,可能是由于函数调用过载成本.您必须知道在此操作期间不会复制任何数据,除非您修改它(修改时为MATLAB副本),因此无论如何它都非常快.

当您需要自定义内容时,重点是重塑,例如:

a = rand(10, 10)
size(reshape(a, 2,[]))
Run Code Online (Sandbox Code Playgroud)

ans =

2    50
Run Code Online (Sandbox Code Playgroud)

  • 您的计时实验虽然有趣,但并未提供有关该问题的信息,因为OP需要行/列来排,而不是矩阵到行. (2认同)