Есть ли способ скопировать матрицу с перекрывающимся рисунком? - PullRequest
0 голосов
/ 31 марта 2019

Я пытаюсь создать матрицу, которая будет копироваться в соответствии с пользовательским вводом.Например,

1 0 0 0
1 0 0 0
1 1 0 0
0 1 0 0
0 1 1 0
0 0 1 0
0 0 1 1
0 0 0 1
1 0 0 1
1 0 0 0
1 1 0 0
.......
.......

Мы видим, что после заполнения 3 строк новый столбец начинает следовать той же схеме.Здесь количество строк должно быть динамическим.

Ответы [ 2 ]

0 голосов
/ 31 марта 2019

Другой динамический подход будет

# define pattern
pattern <- c(1,1,1,0,0,0,0,0)

# number of rows and cols
nrows <- 20
ncols <- 4

# choose rownumber where pattern repeats
rownum <- 3


# Generating data
m <- matrix(c(pattern, rep(0, nrows*ncols - length(pattern))), ncol= ncols)
# identify the length of the pattern
patternlength <- length(pattern)
# repeat pattern in column 1 as desired
m[, 1] <- rep(m[1:patternlength, 1], ceiling(nrow(m)/patternlength))[1:nrow(m)]
# repeat pattern in other columns
sapply(2:ncol(m), function(x){ 
m[rownum:nrow(m), x] <<- m[1:(nrow(m)-rownum + 1), x-1]})
# see results
m
#       [,1] [,2] [,3] [,4]
# [1,]    1    0    0    0
# [2,]    1    0    0    0
# [3,]    1    1    0    0
# [4,]    0    1    0    0
# [5,]    0    1    1    0
# [6,]    0    0    1    0
# [7,]    0    0    1    1
# [8,]    0    0    0    1
# [9,]    1    0    0    1
#[10,]    1    0    0    0
#[11,]    1    1    0    0
#[12,]    0    1    0    0
#[13,]    0    1    1    0
#[14,]    0    0    1    0
#[15,]    0    0    1    1
#[16,]    0    0    0    1
#[17,]    1    0    0    1
#[18,]    1    0    0    0
#[19,]    1    1    0    0
#[20,]    0    1    0    0

EDIT:

Я добавил шаблон переменных, nrows и ncols, чтобы показать, что этот подход тоже динамический.

0 голосов
/ 31 марта 2019
#Input
n_col = 4
n_row = 15
offset_row = 3
basic_pattern = c(1, 1, 1, 0, 0, 0, 0, 0)
#End Input

do.call(cbind,
        lapply(1:n_col, function(j){
            n_zero_top = (j - 1) * (offset_row - 1)
            c(rep(x = 0, times = n_zero_top),
              rep(x = basic_pattern, length.out = n_row - n_zero_top))
        }))
#      [,1] [,2] [,3] [,4]
# [1,]    1    0    0    0
# [2,]    1    0    0    0
# [3,]    1    1    0    0
# [4,]    0    1    0    0
# [5,]    0    1    1    0
# [6,]    0    0    1    0
# [7,]    0    0    1    1
# [8,]    0    0    0    1
# [9,]    1    0    0    1
#[10,]    1    0    0    0
#[11,]    1    1    0    0
#[12,]    0    1    0    0
#[13,]    0    1    1    0
#[14,]    0    0    1    0
#[15,]    0    0    1    1

Может быть, следующее может также сработать для basic_pattern

ones = c(1, 1, 1)
#basic_pattern = c(1, 1, 1, 0, 0, 0, 0, 0)
basic_pattern = c(ones, rep(x = 0, times = (offset_row - 1) * n_col - length(ones)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...