如何强制向量成为行向量?

时间:2018-11-06 14:11:00

标签: arrays matlab vector

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

我希望有一些功能可以将列向量转换为行向量,并使行向量保持不变。例如:

getQuote(): Observable<Quote> {
    const uri = `${this.config.uri}/quotes/${Math.floor(Math.random() * 10)}`;
    return this.httpClient.get(uri)
      .pipe(debug('quote: '), map((res: Quote) => res as Quote));
  }

将输出行向量:

A= [1 2 3];
RowIt(A)

和:

1 2 3

将输出行向量:

B= [1; 2; 3];
RowIt(B) 

最简单的方法是什么?

3 个答案:

答案 0 :(得分:10)

要使任何矢量成为行矢量,只需首先将其强制为列矢量,然后对其进行转置:

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

将行向量解包为列向量,然后再次转置为行向量,然后将列向量解包为列向量(因此不变),然后转置为行向量。

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

A = rand(3,3,3,3);
B = A(:).'; % 81 element row vector

答案 1 :(得分:7)

只需将矩阵/向量重塑为单行:

v = reshape(v,1, [])

它还将使形状正确的矢量保持不变。

如果您转到documentation on reshape,则在给定1的情况下,[]表示1行,而v表示需要的列数。

完整功能:

function v = RowIt(v)
    v = reshape(v,1,[]);
end

与@Adriaan答案相比

Reshape版本:

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

(:).'版本: this answer

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

因此@Adriaan的解决方案显然更快,这可能是由于函数调用重载成本所致。您必须知道在此操作过程中不会复制任何数据,除非您进行了修改(修改时是MATLAB复制),所以它确实非常快。

优点是当您需要自定义内容时可以进行重塑,

a = rand(10, 10)
size(reshape(a, 2,[]))
  

ans =

2    50

答案 2 :(得分:-4)

转置:

A= [1 2 3];
A.'

将输出

1
2
3

您也可以写:

transpose(A)

https://www.mathworks.com/help/matlab/ref/transpose.html