强制任何向量成为行向量的最简单方法是什么?
我希望有一些功能可以将列向量转换为行向量,并使行向量保持不变。例如:
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)
最简单的方法是什么?
答案 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)