Это просто, если вам не нужно использовать вывод из toBand
:
replaceBand <- function(a, b, k) {
swap <- abs(row(a) - col(a)) <= k
a[swap] <- b[swap]
a
}
Создание матриц для демонстрации:
test1 <- matrix(ncol=6, nrow=6)
test1 <- matrix(paste("a", row(test1), col(test1), sep=""), nrow=6)
test1b <- matrix(paste("a", col(test1), row(test1), sep=""), nrow=6)
test1[upper.tri(test1)] <- test1b[upper.tri(test1b)]
test2 <- matrix(paste("*", test1, "*", sep=""), nrow=6)
Вывод точно такой же, кактребуемый:
> replaceBand(test1, test2, 3)
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] "*a11*" "*a21*" "*a31*" "*a41*" "a51" "a61"
[2,] "*a21*" "*a22*" "*a32*" "*a42*" "*a52*" "a62"
[3,] "*a31*" "*a32*" "*a33*" "*a43*" "*a53*" "*a63*"
[4,] "*a41*" "*a42*" "*a43*" "*a44*" "*a54*" "*a64*"
[5,] "a51" "*a52*" "*a53*" "*a54*" "*a55*" "*a65*"
[6,] "a61" "a62" "*a63*" "*a64*" "*a65*" "*a66*"
Вот версии toBand
и replaceBand
, которые работают, как описано.Я полагаю, что было бы чётче делать арифметику, чтобы точно выяснить, как заполнять матрицы, но это способ сделать это, не думая очень усердно.Возможно, кто-то еще так ответит.
toBand <- function(x,k) {
n <- nrow(x)
out <- matrix(nrow=n, ncol=n)
out[row(out) + col(out) - 1 <= n] <- x[lower.tri(x, diag=TRUE)]
out[1:(k+1),]
}
replaceBand <- function(a, b) {
b[row(b)+col(b)-1 <= ncol(b)]
swap <- abs(row(a) - col(a)) <= nrow(b) - 1
a[swap & lower.tri(a, diag=TRUE)] <- b[row(b)+col(b)-1 <= ncol(b)]
a[upper.tri(a)] <- t(a)[upper.tri(a)]
a
}