2015-12-27 3 views
0

Я хотел бы выполнить некоторые операции на простой матрице, скажем:векторизации с различными colindices

aaa <- matrix(runif(200), ncol=5) 
aaa 

То, что я хотел бы сделать: добавить номер - например, 100 - в некоторых значениях матрица в фиксированных строках (т. е. должно быть фиксированное расстояние), но меняться (т.е. здесь не должно быть шаблона).

Для примера см желаемый результат после некоторых модификаций:

aaa[1:5, c(3,5)] <- aaa[1:5, c(3,5)] + 100 
aaa[11:15, c(1,2)] <- aaa[11:15, c(1,2)] + 100 
aaa[21:25, c(4,5)] <- aaa[21:25, c(4,5)] + 100 
aaa[31:35, c(1,5)] <- aaa[31:35, c(1,5)] + 100 
aaa 

Я также иметь матрицу столбцов, которые должны быть изменены:

bbb <- matrix(cbind(c(3,5),c(1,2),c(4,5),c(1,5)), ncol = 4) 

и следующий вектор индексов строк

ccc <- c(1:5, 11:15, 21:25, 31:35) 

Это можно решить, используя петлю, но ее также можно решить путем v ectorization? По моему мнению, это невозможно, потому что столбцы меняются. Или я чего-то не хватает?

ответ

2

Да, это можно сделать с помощью кода формы:

Mat[ cbind(rows, cols) ] <- vals 

Я не думаю, что ваши ожидания повторно: индексация правильны. Вы можете сделать:

Idx <- cbind(rep(1:5, 2), rep(c(2,5), 5)) 
aaa[Idx]<-aaa[Idx]+100 

Вы можете строить новые векторы из 'ВВВ' и "КТС с:

cbind(ccc, # will get recycled 
    c(apply(bbb,2, rep, each=5))) 

И потом:

Idx <- cbind(ccc, c(apply(bbb, 2, rep, each=5))) 

aaa[ Idx] <- aaa[Idx]+100 
+0

Здравствуйте 42-, могли бы вы разработать бит в отношении моего примера? Я не могу просто cbind (rows, cols) из-за неправильных измерений. – user3032689

+0

Это зависит от ваших намерений с использованием c (2,5). Я предполагаю, что вы хотели использовать rep (2,5)? –

+0

Нет, e. г. c (2, 5) Я имел в виду обращение к столбцам с индексами 2 и 5. Эти индексы столбцов различаются по назначению между итерациями. – user3032689

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