2013-04-14 5 views
2

Я пытаюсь создать матрицу из заданного вектора в R, но я не знаю, как ее достичь простым способом. Я приведу пример ниже. Матрица была сделана с использованием функции «cbind».Как создать матрицу, как показано ниже в R

Учитывая е как

[1,] 1 
[2,] 3 
[3,] 4 

как я могу создать матрицу ниже с простым методом?

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

Благодарим за помощь!

+0

Имеет ли это язык, связанный с ним, или это математический вопрос? – Kermit

+0

Извините за двусмысленный вопрос, теперь все ясно. Я пытаюсь сделать это в R. – user1618083

ответ

2

Это работает. (Редактировать: нет голосов, может быть, слишком телеграфных?) Идея состоит в том, чтобы создать матрицу нулевого размера с соответствующими размерами, а затем использовать арифметику строки/столбца (используя функции row() и col()), чтобы заполнить требуемые значения в элементы, где row-column находится между 0 и 2 (т.е. диагональ и первые две нижние диафрагмы). Это действительно полагается на столбцы структуры матриц в R ...

x <- c(1,3,4) 
n <- 6 
m <- matrix(0,ncol=n,nrow=n+length(x)-1) 
betw <- function(x,a,b) x>=a & x<= b 
m[betw(row(m)-col(m),0,2)] <- x 
+0

И много повторного использования в конечном задании. Да, лучшее объяснение идеи действительно помогает. –

3
matrix(c(1,3,4,rep(0,6)),ncol=6,nrow=8) 

Вы получите предупреждение, но правильная матрица. Если вам не нравится, предупреждение просто использовать SuppressWarnings:

suppressWarnings(matrix(c(1,3,4,rep(0,6)),ncol=6,nrow=8)) 

Конечно, будьте осторожны с этой функцией, если вы пытаетесь абстрагироваться это более общие случаи.

4

Используя append и sapply

sapply(0:5, append, x = rep(0,5), values = c(1,3,4)) 

#  [,1] [,2] [,3] [,4] [,5] [,6] 
# [1,] 1 0 0 0 0 0 
# [2,] 3 1 0 0 0 0 
# [3,] 4 3 1 0 0 0 
# [4,] 0 4 3 1 0 0 
# [5,] 0 0 4 3 1 0 
# [6,] 0 0 0 4 3 1 
# [7,] 0 0 0 0 4 3 
# [8,] 0 0 0 0 0 4 
+0

Очень приятное решение, именование других аргументов, чтобы итератор переходил к аргументу 'after' в' append'. –

2

Этот метод является очень интуитивным:

x <- c(1,3,4) 
n <- 6 
m <- matrix(0,ncol=n,nrow=n+length(x)-1) 
diag(m) <- 1 
diag(m[-1,]) <- 3 
diag(m[-c(1, 2),]) <- 4 

Назначение вдоль диагоналей может быть легко автоматизирована, например, с 'для' петли

for(i in seq_along(x)) diag(m[1:n + i - 1,]) <- x[i] 

Оба выхода:

R> m 
    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 1 0 0 0 0 0 
[2,] 3 1 0 0 0 0 
[3,] 4 3 1 0 0 0 
[4,] 0 4 3 1 0 0 
[5,] 0 0 4 3 1 0 
[6,] 0 0 0 4 3 1 
[7,] 0 0 0 0 4 3 
[8,] 0 0 0 0 0 4 
+1

Было бы намного лучше, если бы вектор 'x' использовался в решении (например, используйте цикл, который выполняет задания' diag <-'). –

+0

@MatthewLundberg, добавлена ​​для решения этой проблемы. – Ryogi

+0

Спасибо, ребята, все эти решения работают для меня. Метод mnel действительно изящный !! – user1618083

Смежные вопросы