costebk08
costebk08

Reputation: 1359

Generating a large matrix from smaller matrices in R

I have a directory matrix that contains a series of text file matrices of 0s and 1s of varying sizes which look like:

txt.1
0 1 0
1 1 1
0 0 1
txt.2
1 1 0
0 1 1
txt.3
1 1 1 1
0 1 0 1
0 0 0 0

I am trying create a larger diagonal matrix from these smaller matrices that replaces all the values in the smaller matrices with 0 and fills in the empty spaces in the diagonal with 1s so that the final result looks like:

print(bigmatrix)
0 0 0 1 1 1 1 1 1 1
0 0 0 1 1 1 1 1 1 1
0 0 0 1 1 1 1 1 1 1
1 1 1 0 0 0 1 1 1 1
1 1 1 0 0 0 1 1 1 1
1 1 1 0 0 0 1 1 1 1
1 1 1 1 1 1 0 0 0 0
1 1 1 1 1 1 0 0 0 0
1 1 1 1 1 1 0 0 0 0
1 1 1 1 1 1 0 0 0 0

Is there some way to use bdiag or some other function here? I have only been able to get bigdiag to fill in everything with 0s.

Upvotes: 2

Views: 923

Answers (2)

Alexey Ferapontov
Alexey Ferapontov

Reputation: 5169

You don't need to know the elements of each small matrix, just create N matrices filled with 1's and dimension of max(dim(mx))

m1 = matrix(1,3,3)
m2 = matrix(1,3,3)
m3 = matrix(1,4,4)

lst = list(m1,m2,m3)
print(lst)
m0 = as.matrix(bdiag(lst))
m0 = ifelse(m0 == 0, 1, 0)
View(m0)

Result:

    V1  V2  V3  V4  V5  V6  V7  V8  V9  V10
1   0   0   0   1   1   1   1   1   1   1
2   0   0   0   1   1   1   1   1   1   1
3   0   0   0   1   1   1   1   1   1   1
4   1   1   1   0   0   0   1   1   1   1
5   1   1   1   0   0   0   1   1   1   1
6   1   1   1   0   0   0   1   1   1   1
7   1   1   1   1   1   1   0   0   0   0
8   1   1   1   1   1   1   0   0   0   0
9   1   1   1   1   1   1   0   0   0   0
10  1   1   1   1   1   1   0   0   0   0

Upvotes: 1

costebk08
costebk08

Reputation: 1359

This method works:

library(Matrix)
library(MASS)
structural0<-lapply(dir(), function(x){as.matrix(read.table(x))})
structural0<-lapply(structural0,function(x){ifelse(x==0,1,1)})
structural0<-bdiag(structural0)
write.matrix(structural0, file="structural0.txt")
structural0a<-as.matrix(read.table("structural0.txt"))
structural0a<-ifelse(structural0a==0,1,0)
write.matrix(structural0a, file="structural0a.txt")

However, I wonder if there is a more efficient way of doing it. Thank you.

Upvotes: 0

Related Questions