为什么这个代码会双向转置一个向量 - 这是一个noop?

时间:2015-06-19 00:21:00

标签: r matrix transpose

我有一些遗留的R代码:

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

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

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

2 个答案:

答案 0 :(得分:5)

使用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))

答案 1 :(得分:4)

我认为明确设置尺寸而不是双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() s有点代码味道; 在这种情况下,您最好使用其他矩阵运算,例如solve(crossprod(x), crossprod(x,y)),这样可以减少开销,从而获得相同的结果。