2012-09-07 118 views
-3

我有这样的二进制martix子集二进制矩阵

a0=rep(1,40) 
a=rep(0:1,20) 
b=c(rep(1,20),rep(0,20)) 
c0=c(rep(0,12),rep(1,28)) 
c1=c(rep(1,5),rep(0,35)) 
c2=c(rep(1,8),rep(0,32)) 
c3=c(rep(1,23),rep(0,17)) 
da=matrix(cbind(a0,a,b,c0,c1,c2,c3),nrow=40,ncol=7) 

我需要这个矩阵到子集成两个子集(矩阵),其具有相同的列数和不同的行数(比如85%比15%),但在修剪期间,你可以记住2个子集没有共线性。

我有问题。 当我达子集使用

ind <- sample(1:nrow(da), trunc(85*nrow(da)/100)) 
trda <- da[ind,] 
teda <- da[-ind,] 

我得到这些子集不是满秩的一个。

有人可以向我解释如何将它们子集而不会产生共线性吗?这只是一个例子。我处理大矩阵

感谢

+1

鉴于奇异/非奇异矩阵必须是正方形,我不知道如何将80000x900矩阵拆分为两个正方形... – Spacedman

+0

我不知道,因为您没有说任何关于交叉产品。就目前来看,这听起来像是你想把一个大矩阵分成两个更小的矩阵。 “分裂”是什么意思?对我而言,这意味着将矩阵沿行或列切成两块。这并不意味着采取可能不连续的行或列的子集。你真的需要编辑你的问题,也许给我们一个例子(可能是一个12x5矩阵作为例子) – Spacedman

回答

0

既然你只有零和一在列,共线行是相同的行。

计算通过粘贴行字符串沿着列:

> das = apply(da,1,paste,collapse="") 
> das 
[1] "1010111" "1110111" "1010111" "1110111" "1010111" "1110011" "1010011" 
[8] "1110011" "1010001" "1110001" "1010001" "1110001" "1011001" "1111001" 
[15] "1011001" "1111001" "1011001" "1111001" "1011001" "1111001" "1001001" 
[22] "1101001" "1001001" "1101000" "1001000" "1101000" "1001000" "1101000" 
[29] "1001000" "1101000" "1001000" "1101000" "1001000" "1101000" "1001000" 
[36] "1101000" "1001000" "1101000" "1001000" "1101000" 

然后快速测试,如果这是可以做到或没有任何字符串是否出现两倍以上:

> any(table(das)>2) 
[1] TRUE 

,因为如果有超过两个,那么你的一个矩阵至少有两个同一行。例如,您有八个1001000行。

要做到实际的分割,如果可以完成的话,你只需要把每一行出现两次,并将它们放在每个矩阵中,然后用任何你喜欢的方法来分割其余的。

我们在这里的正确路线?