2017-02-15 26 views
2

Это, наверное, действительно тривиальный вопрос, но я пока не нашел для него приемлемого решения. Здесь есть аналогичный вопрос, но он не получил работоспособного ответа, поэтому я благодарен за любой совет.Умножьте один столбец матрицы с фиксированным коэффициентом

У меня есть простая матрица 3x3 и вы хотите умножить 2-й столбец на фиксированный коэффициент. Пример:

m<-matrix(rep(c(1,2,3),1*3),nrow=3) 
m 
    [,1] [,2] [,3] 
[1,] 1 1 1 
[2,] 2 2 2 
[3,] 3 3 3 

Если я пытаюсь сделать m[,2]*5, это дает мне [1] 5 10 15

В результате я хотел бы выглядеть следующим образом:

 [,1] [,2] [,3] 
[1,] 1 5 1 
[2,] 2 10 2 
[3,] 3 15 3 

Это не может быть то, что трудно, может Это?

+6

Просто назначьте ito 'm [, 2] <- m [, 2] * 5' Или без назначения' m * c (1, 5, 1) [col (m)] ' – akrun

+1

да, это работает. Спасибо! – Jane

+0

Я поставил это как ответ, для более удобного поиска в будущем. – PinkFluffyUnicorn

ответ

0

Я думаю, что более общий подход, чем одной уступки колонки будет sweep с вектором c(1,5,1):

sweep(m, 2, c(1,5,1), "*") 
    [,1] [,2] [,3] 
[1,] 1 5 1 
[2,] 2 10 2 
[3,] 3 15 3 

Тогда можно применить один вектор на матрицу и не требуют повторных операций с одной колонкой:

sweep(m, 2, c(2,5,10), "*") 
    [,1] [,2] [,3] 
[1,] 2 5 10 
[2,] 4 10 20 
[3,] 6 15 30 

@ Решение akrun i n комментариев m*c(1, 5, 1)[col(m)], кажется, делает это эффективно, но мне было трудно понять, как это работает. Кажется, что это зависит от приоритетности операций и мне было бы легче понять, было ли это написано: c(1, 5, 1)[col(m)]*m. Это делает более ясным то, что сначала вычисляется вектор c(1, 5, 1)[col(m)], а не m*c(2,5,10), который извлекается [col(m)].

+0

Это кажется излишним, чтобы сделать t (t (m) * c (1,5,1)) 'и т. Д. –

+0

Я не знаю, кажется ли вам, что делать два транспозиции просто вам. Для меня это не похоже. Я предполагаю, что предложение акруна будет превосходить ваши или мои, если бы оно было увеличено. –