0

次のマトリックスがあります。

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

要素が1に等しい部分行列の7x4次元を抽出する方法を知りたい.

4

4 に答える 4

0

あなたは効果的に「どれだけの行と列が含まれているか」を尋ねていますか? これらの質問は、次を使用して最も簡単に答えられapplyます。

apply(M,1,any)
apply(M,2,any)

ゼロ以外のものを含む行と列の数をそれぞれ教えてくれます。

非ゼロ性をテストすることが本当に問題ではない場合は、目的の行などanyを返す関数に置き換えます。TRUEFALSE

それらが部分行列を形成することを保証できない場合 (つまり、それらが長方形でない場合)、これよりもさらに多くの作業を行う必要があります。

于 2016-10-24T10:03:53.027 に答える
0

スパース行列に強制して、インデックス スロットを抽出できます。

library(Matrix)
m <- as(M, "TsparseMatrix")
#row dim:
diff(range(m@i)) + 1L
#[[1] 7

#column dim:
diff(range(m@j)) + 1L
#[1] 4

これは非常に効率的であり、マトリックスをスパースマトリックスとして保存/処理すると便利な場合があります。

于 2016-10-24T11:00:19.283 に答える
0

JDLの回答に似ていますが、サブマトリックスの次元を直接提供します:

mat <- structure(c(
0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L
), .Dim = c(10L, 10L), .Dimnames = list(NULL, NULL))

dim(mat[apply(mat, 1, any), apply(mat, 2, any)])
#[1] 7 4

これにより、ゼロのみを含む行と列が削除されます。少なくとも 1 つ1の を含む行と列を保持したい場合は、次のようにします。

mat[3, 5] <- 2 #just to complicate it a little

f <- function(x) any(x==1) #create a simple function

dim(mat[apply(mat, 1, f), apply(mat, 2, f)])
#[1] 7 4
于 2016-10-24T11:00:39.073 に答える
0

あなたが試すことができます:

apply(which(matrix==1, arr.ind = T), 2, function(x) length(unique(x)))
row col 
  7   4 
于 2016-10-24T10:07:56.650 に答える