为什么这段代码要双重转置一个向量——这是一个空话吗?
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))
,这会以更少的开销提供相同的结果。
我有一些遗留的 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))
,这会以更少的开销提供相同的结果。