如何定期处理矩阵和向量(例如,在Matlab中)

ska*_*auf 3 r vector matrix

假设我有一个函数,它采用维数为1或2的参数x.我想做类似的事情

x[1, i]
Run Code Online (Sandbox Code Playgroud)

无论我是否有一个向量或矩阵(或一个变量的表,或两个).

例如:

x = 1:5
x[1,2] # this won't work...
Run Code Online (Sandbox Code Playgroud)

当然,我可以检查哪个类作为参数给出,或者强制参数为矩阵,但我宁愿不这样做.例如,在Matlab中,向量具有除1维大小之外的所有矩阵的矩阵(并且可以被视为行或列等).这使代码变得美观而且规则.

另外,有没有人知道为什么R向量(或一般的一维对象)不是矩阵(或多维对象)的特殊情况?

谢谢

Rei*_*son 5

在R中,它是相反的; 矩阵是向量.类似矩阵的行为来自对象的原子矢量部分之上的一些额外属性.

要获得所需的行为,您需要通过使用dim()或显式强制设置向量上的维度,使向量成为矩阵.

> vm <- 1:5
> dim(vm) <- c(1,5)
> vm
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    3    4    5
> class(vm)
[1] "matrix"
Run Code Online (Sandbox Code Playgroud)

接下来,您需要在子集化时保持尺寸; 默认情况下,R将删除空尺寸,在vm上面的情况下是行尺寸.你可以drop = FALSE在通话中使用'['().默认情况下的行为是drop = TRUE:

> vm[, 2:4]
[1] 2 3 4
> vm[, 2:4, drop = FALSE]
     [,1] [,2] [,3]
[1,]    2    3    4
Run Code Online (Sandbox Code Playgroud)

您可以在矩阵中添加一个类,并为默认设置[参数的类编写方法dropFALSE

class(vm) <- c("foo", class(vm))
`[.foo` <- function(x, i, j, ..., drop = FALSE) {
  clx <- class(x)
  class(x) <- clx[clx != "foo"]
  x[i, j, ..., drop = drop]
}
Run Code Online (Sandbox Code Playgroud)

在使用中给出:

> vm[, 2:4]
     [,1] [,2] [,3]
[1,]    2    3    4
Run Code Online (Sandbox Code Playgroud)

即维持空的维度.

使这种万无一失和普及需要更多努力,但上述内容将帮助您入门.