神秘矩阵子集

时间:2018-06-14 13:25:01

标签: r matrix

我前几天遇到了这个奇怪的矩阵操作,无法弄清楚它在做什么。 考虑:

a<-matrix(nrow=2,ncol=2,c(9,8,7,6))
b<-matrix(nrow=2,ncol=2,c(1,2,1,2))
a[b]

哇!你怎么能用矩阵来分配另一个矩阵?无论如何 - 这是结果

 a[b]
 #[1] 9 6

我想也许b正在提供索引以引用a(即得到1,1然后得到2,2。但如果发生了这种情况,当你这样做时,规则会被抛出窗外

a<-matrix(nrow=3,ncol=3,c(9,8,7,6,5,4,3,2,1))
b<-matrix(nrow=3,ncol=3,c(1,2,3,2,2,2,1,1,1))
a[b]
#[1] 9 8 7 8 8 8 9 9 9

有谁知道这里发生了什么?

2 个答案:

答案 0 :(得分:2)

这不是一个谜。在第二个示例中,索引矩阵b被视为数字:

as.numeric(b)
#[1] 1 2 3 2 2 2 1 1 1
a[as.numeric(b)]
#[1] 9 8 7 8 8 8 9 9 9

你必须记住,除了有一个二维ij(行x列)索引之外,矩阵也有一维的,其中每个元素按顺序分配一个数字,从顶部开始-left元素并沿着列向下。因此a[1, 1]a[1]相同,a[2, 2]a[5]相同。因此a[b]会为您c(a[1], a[2], a[3], a[2],...,a[1])提供c(a[1,1], a[2,1], a[3,1], a[2,1], a[2,1],..., a[1,1]),与<?php include_once 'includes/main/WebUI.php'; require_once 'includes/Loader.php'; require_once 'modules/SMSNotifier/SMSNotifier.php'; $tonumbers = array('994255xxxx'); $message = "Test From Ramesh"; SMSNotifier::fireSendSMS($message, $tonumbers); 相同。

答案 1 :(得分:1)

矩阵本质上是具有维度属性的数字向量。在R中,使用“列主要顺序”存储矩阵,这意味着矩阵按列填充。这意味着以下内容:

a <- matrix(1:4, nrow = 2)
> a
#     [,1] [,2]
#[1,]    1    3
#[2,]    2    4

由于它也是一个向量,您仍然可以使用单个索引访问a的元素。

> a[1]
#1
> a[2]
#2
> a[3]
#3

当您在括号运算符之间放置一个变量时,它会尝试将您的变量强制转换为整数向量,这样它就会成为数字向量a的一组索引。

为了更好地理解,您可以尝试以下方法:

 a<-matrix(nrow=3,ncol=3,c(9,8,7,6,5,4,3,2,1))
 b<-matrix(nrow=3,ncol=3,c(1,2,3,2,2,2,1,10,1)) # a[10] = NA
 > a[b]
 # [1]  9  8  7  8  8  8  9 NA  9     

由于括号将矩阵强制转换为整数向量,您甚至可以设想具有浮动值的b矩阵:

b<-matrix(nrow=3,ncol=3,c(1.1,2.1,3.9,2.8,2,2,1,10.5,1))
> a[b]
# [1]  9  8  7  8  8  8  9 NA  9

这是因为,如前所述:

> as.integer(b) # same as as.integer(c(1.1,2.1,3.9,2.8,2,2,1,10.5,1))
#  1  2  3  2  2  2  1 10  1