在R中扩展矩阵

时间:2014-06-20 22:22:40

标签: r matlab matrix resize

我正在开发一个涉及将MATLAB代码移植到R中的项目,并且在一段代码中遇到了一些麻烦。

MATLAB中的代码片段是将掩码(仅1和0)的大小调整为与将要屏蔽的更大数据集相同的大小。应用蒙版的数据会改变大小,因此我不能只为缩放设置静态值。

MATLAB代码有一个函数resizem,可以调整掩码的大小,保留唯一的1和0特征。

我搜索(无济于事)我的问题的解决方案,但我不认为我的问题困扰了许多R用户(这是R的非传统用法)。所以我想知道是否有人知道如何以与resizem相同的方式调整矩阵的大小。

例如:

如果我有阵列

[1,0,1,1,1,
0,0,0,1,1,
1,1,0,0,1]

我想将它从3x5扩展到7x10,而7x10矩阵只包含1s和0s。

 1     1     0     0     1     1     1     1     1     1
 1     1     0     0     1     1     1     1     1     1
 0     0     0     0     0     0     1     1     1     1
 0     0     0     0     0     0     1     1     1     1
 0     0     0     0     0     0     1     1     1     1
 1     1     1     1     0     0     0     0     1     1
 1     1     1     1     0     0     0     0     1     1

我怎样才能用R函数来解决这个问题。

2 个答案:

答案 0 :(得分:2)

这是这种功能的一种可能的R实现

resizem <- function(M, rows,cols) {
    rs <- round(seq(0, rows-1)/(rows-1) * (nrow(M)-1) +1)
    cs <- round(seq(0, cols-1)/(cols-1) * (ncol(M)-1) +1)
    M[rs, ][, cs]
}

这里我们只要求您在新矩阵中指定所需的行数和列数。我们只使用默认的最近邻插值(resizem有其他选项)。这似乎适用于测试数据

M <- matrix(c(1,0,1,1,1,
    0,0,0,1,1,
    1,1,0,0,1), byrow=T, nrow=3)
resizem(M, 7,10)

然后返回

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    1    1    0    0    1    1    1    1    1     1
[2,]    1    1    0    0    1    1    1    1    1     1
[3,]    0    0    0    0    0    0    1    1    1     1
[4,]    0    0    0    0    0    0    1    1    1     1
[5,]    0    0    0    0    0    0    1    1    1     1
[6,]    1    1    1    1    0    0    0    0    1     1
[7,]    1    1    1    1    0    0    0    0    1     1

答案 1 :(得分:1)

当重新缩放的矩阵不是原始蒙版大小的整数倍时,这对我来说并不是很明显,但如果是,那么你可以使用{{ 3}}:

kronecker(z,matrix(1,nrow=2,ncol=2))

这使得6x10矩阵。要制作(3nx5n)矩阵,您可以在上面的示例中使用nrow=n,ncol=n

好的,我从链接的文档中看到:

  

resizem使用插值重新采样到新的样本密度/单元格   尺寸。如果scale在0和1之间,则Z的大小小于   Z1的大小。如果scale大于1,则Z的大小更大。对于   例如,如果scale为0.5,则行数和列数   将减半。默认情况下,resizem使用最近邻居   内插。

所以这个技巧只适用于特殊情况。但它应该非常有效,并且也可以用在稀疏矩阵上......