我正在开发一个涉及将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函数来解决这个问题。
答案 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使用最近邻居 内插。
所以这个技巧只适用于特殊情况。但它应该非常有效,并且也可以用在稀疏矩阵上......