为什么这段代码要双重转置一个向量——这是一个空话吗?

Why does this code double transpose a vector - is this a noop?

我有一些遗留的 R 代码可以:

b = t(a)
c = t(b)

这段代码有什么作用?对我来说看起来像个傻瓜。 a是由c(1:20)构造的向量。

编辑:关于如何做得更好的奖励积分。

使用str查看结构:

> str(a); str(b); str(c)
 int [1:20] 1 2 3 4 5 6 7 8 9 10 ...
 int [1, 1:20] 1 2 3 4 5 6 7 8 9 10 ...
 int [1:20, 1] 1 2 3 4 5 6 7 8 9 10 ...

最后的转置操作将向量a发送到一个20行1列的矩阵。相当于:

c <- as.matrix(c(1:20))

我认为显式设置尺寸而不是双尺寸更清楚 t():

dim(a) <- c(length(a), 1)

应该避免复制。

我在较旧的代码中已经看到了很多,例如对于最小二乘法,可以从以下代码开始:

solve(t(x) %*% x) %*% t(x) %*% y

并且,认为它会保存转置,重构为:

xt <- t(x)
solve(xt %*% x) %*% xt %*% y

如果 x 还不一定是矩阵,

xt <- t(a)
x <- t(xt)

但是 t() 有点代码味; 在这种情况下,您最好改用其他矩阵运算,例如 solve(crossprod(x), crossprod(x,y)),这会以更少的开销提供相同的结果。