不能将矩阵数类强制转换为整数

iso*_*mes 11 oop r class matrix

我正在编写一个邻接矩阵R:

neighbours <- array(0, c(100,100))
for (i in 1:100) { neighbours[i,i] = 1 }    #reflexive
Run Code Online (Sandbox Code Playgroud)

但后来我发现了class(neighbours)double matrix.用更大的矩阵来占用太多空间.所以我想强迫这个类型integer,甚至更好,因为这是无向的,logical.

但...

> class(neighbours[5])
[1] "numeric"
> class(neighbours[5]) <- "integer"
> class(neighbours[5])
[1] "numeric"
Run Code Online (Sandbox Code Playgroud)

这不是听我的!

Jos*_*ich 9

最好不要首先将其初始化为数字,但如果你不能这样做,请设置storage.mode:

R> neighbours <- array(0, c(100,100))
R> for (i in 1:100) { neighbours[i,i] = 1 }
R> str(neighbours)
 num [1:100, 1:100] 1 0 0 0 0 0 0 0 0 0 ...
R> storage.mode(neighbours) <- "integer"
R> str(neighbours)
 int [1:100, 1:100] 1 0 0 0 0 0 0 0 0 0 ...
R> storage.mode(neighbours) <- "logical"
R> str(neighbours)
 logi [1:100, 1:100] TRUE FALSE FALSE FALSE FALSE FALSE ...
Run Code Online (Sandbox Code Playgroud)


rap*_*ure 5

对于那些仍在寻找将现有数字矩阵强制为整数的方法的人:

m2 <- apply (m, c (1, 2), function (x) {
  (as.integer(x))
  })
Run Code Online (Sandbox Code Playgroud)

c(1,2)表示将函数应用于行和列.测试元素的类然后给出:

> class(m2[1,])
[1] "integer"
> class(m[1,])
[1] "numeric"
> 
Run Code Online (Sandbox Code Playgroud)

我正在寻找这样的东西因为我需要转换已经存在的数字矩阵.这是计算速度非常慢的结果,因此修改代码会比简单地转换结果花费更多的时间.


bna*_*aul 3

也许我遗漏了一些东西,但为什么不直接将其声明为逻辑数组呢?

neighbors <- array(FALSE, c(100,100))
diag(neighbors) <- TRUE
Run Code Online (Sandbox Code Playgroud)

两者比较:

> object.size(array(0, c(100,100)))
80200 bytes
> object.size(array(FALSE, c(100,100)))
40200 bytes
Run Code Online (Sandbox Code Playgroud)

编辑:我很想知道为什么逻辑数组每个条目占用 4B,但是......