当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R indMatrix-class 索引矩阵


R语言 indMatrix-class 位于 Matrix 包(package)。

说明

indMatrix 类是行和列索引矩阵的类,存储为从 1 开始的整数索引向量。行(列)索引矩阵是以标准单位向量为行(列)的矩阵。当将观测值映射到离散的协变量值集时,此类矩阵非常有用。

将左侧矩阵乘以行索引矩阵相当于对其行进行索引,即对行“with replacement”进行采样。类似地,将右侧矩阵乘以列索引矩阵相当于对其列进行索引。事实上,此类产品在 Matrix 中作为索引操作实现;请参阅下面的“详细信息”。

行和列为标准单位向量的矩阵称为置换矩阵。这种特殊情况由 pMatrix 类指定,它是 indMatrix 的直接子类。

细节

索引矩阵的转置是与 perm 相同但与 margin 相反的索引矩阵。因此,行索引矩阵的转置是列索引矩阵,反之亦然。

行索引矩阵 R 与其本身的叉积是一个对角矩阵,其对角线条目是 R 每列中的条目数。

给定一个带有 permp 的行索引矩阵 R 、一个带有 permq 的列索引矩阵 C 和一个具有一致尺寸的矩阵 M ,我们有

= R %*% M = M[p, ]
= M %*% C = M[, q]
= crossprod(C, M) = M[q, ]
= tcrossprod(M, R) = M[, p]
= crossprod(R) = Diagonal(x=tabulate(p, ncol(R)))
= tcrossprod(C) = Diagonal(x=tabulate(q, nrow(C)))

对索引矩阵进行的操作会相应地返回 indMatrix 。这些包括两个列索引矩阵的乘积和(等效地)列索引矩阵的column-indexing(当未删除维度时)。 indMatrix 上的大多数其他操作将它们视为稀疏非零模式矩阵(即从虚拟类 nsparseMatrix 继承)。因此 indMatrix 的 vector-valued 子集(例如 diag 给出的子集)始终为 "logical" 类型。

类中的对象

可以使用 new("indMatrix", ...) 形式的调用显式创建对象,但更常见的是通过使用 as(., "indMatrix") 形式的调用强制基于 1 的整数索引向量来创建对象;请参阅下面的“方法”。

插槽

margin

一个整数,1 或 2,指定矩阵是行 (1) 还是列 (2) 索引。

perm

从 1 开始的整数索引向量,即长度为 Dim[margin] 且元素取自 1:Dim[1+margin%%2] 的向量。

DimDimnames

从虚拟超类 Matrix 继承。

扩展

直接类 "sparseMatrix""generalMatrix"

方法

%*%

signature(x = "indMatrix", y = "Matrix")showMethods("%*%", classes = "indMatrix") 列出的其他内容:在适当的情况下作为索引操作实现的矩阵乘积。

coerce

signature(from = "numeric", to = "indMatrix"):支持从正整数向量构建典型的indMatrix。假定行索引。

coerce

signature(from = "list", to = "indMatrix") :支持行和列索引的indMatrix构造,包括长度为0的索引向量和最大值小于被索引的行或列数的索引向量。

coerce

signature(from = "indMatrix", to = "matrix") :强制转换为 logical 类型的传统 matrix,并用 FALSETRUE 代替 0 和 1。

t

signature(x = "indMatrix") :转置,它是与 perm 相同但与 margin 相反的 indMatrix

rowSumsrowMeanscolSumscolMeans

signature(x = "indMatrix"):行和列的总和及平均值。

rbind2cbind2

signature(x = "indMatrix", y = "indMatrix") :具有相同列数的两个行索引矩阵的按行串联以及具有相同行数的两个列索引矩阵的按列串联。

克罗内克

signature(X = "indMatrix", Y = "indMatrix"):两个行索引矩阵或两个列索引矩阵的克罗内克积,给出与其“interaction”对应的行或列索引矩阵。

例子

p1 <- as(c(2,3,1), "pMatrix")
(sm1 <- as(rep(c(2,3,1), e=3), "indMatrix"))
stopifnot(all(sm1 == p1[rep(1:3, each=3),]))

## row-indexing of a <pMatrix> turns it into an <indMatrix>:
class(p1[rep(1:3, each=3),])

set.seed(12) # so we know '10' is in sample
## random index matrix for 30 observations and 10 unique values:
(s10 <- as(sample(10, 30, replace=TRUE),"indMatrix"))

## Sample rows of a numeric matrix :
(mm <- matrix(1:10, nrow=10, ncol=3))
s10 %*% mm

set.seed(27)
IM1 <- as(sample(1:20, 100, replace=TRUE), "indMatrix")
IM2 <- as(sample(1:18, 100, replace=TRUE), "indMatrix")
(c12 <- crossprod(IM1,IM2))
## same as cross-tabulation of the two index vectors:
stopifnot(all(c12 - unclass(table(IM1@perm, IM2@perm)) == 0))

# 3 observations, 4 implied values, first does not occur in sample:
as(2:4, "indMatrix")
# 3 observations, 5 values, first and last do not occur in sample:
as(list(2:4, 5), "indMatrix")

as(sm1, "nMatrix")
s10[1:7, 1:4] # gives an "ngTMatrix" (most economic!)
s10[1:4, ]  # preserves "indMatrix"-class

I1 <- as(c(5:1,6:4,7:3), "indMatrix")
I2 <- as(7:1, "pMatrix")
(I12 <- rbind(I1, I2))
stopifnot(is(I12, "indMatrix"),
          identical(I12, rbind(I1, I2)),
	  colSums(I12) == c(2L,2:4,4:2))

作者

Fabian Scheipl and Uni Muenchen, building on the existing class pMatrix after a nice hike's conversation with Martin Maechler. Methods for crossprod(x, y) and kronecker(x, y) with both arguments inheriting from indMatrix were made considerably faster thanks to a suggestion by Boris Vaillant. Diverse tweaks by Martin Maechler and Mikael Jagan, notably the latter's implementation of margin, prior to which the indMatrix class was designated only for row index matrices.

也可以看看

置换矩阵的子类pMatrix,索引矩阵的特殊情况;非零模式矩阵的虚拟类nMatrix及其子类。

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Index Matrices。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。