Как заставить обобщенную функцию обновить значение вектора? - PullRequest
0 голосов
/ 09 июня 2018

Я пытался написать обобщенную функцию, которая умножает каждое значение в каждой строке матрицы на соответствующее значение вектора с точки зрения их положения (то есть матрица [1,1] * вектор [1], матрица [1,2] * vector [2] и т. Д.), А затем суммируйте их вместе.Важно отметить, что длины вектора и строк матрицы всегда одинаковы, что означает, что в каждой строке первое значение вектора умножается на первое значение строки матрицы.Я также считаю важным отметить, что строки и столбцы матрицы имеют одинаковую длину.Конечная сумма для каждой строки должна быть назначена различному существующему вектору, длина которого равна числу строк.

Это матрица и вектор:

a <- c(4, -9, 2, -1)
b <- c(-1, 3, -8, 2)
c <- c(5, 2, 6, 3)
d <- c(7, 9, -2, 5)
matrix <- cbind(a,b,c,d)

      a  b c  d
[1,]  4 -1 5  7
[2,] -9  3 2  9
[3,]  2 -8 6 -2
[4,] -1  2 3  5

vector <- c(1, 2, 3, 4)

Этоосновные функции, которые я должен обобщить для строк и столбцов матрицы и вектора длин " n ":

f.1 <- function() {
    (matrix[1,1]*vector[1] 
     + matrix[1,2]*vector[2] 
     + matrix[1,3]*vector[3]
     + matrix[1,4]*vector[4])
}
f.2 <- function() {
    (matrix[2,1]*vector[1] 
     + matrix[2,2]*vector[2] 
     + matrix[2,3]*vector[3] 
     + matrix[2,4]*vector[4])
}

and so on...

Это функция, которую я написал:

ncells = 4

f = function(x) {
i = x
result = 0
for(j in 1:ncells) {
result = result + vector[j] * matrix[i][j]
}
return(result)
}

Вызов функции:

result.cell = function() {
for(i in 1:ncells) {
new.vector[i] = f(i)
}
}

Вектор, которому должен быть присвоен этот результат (т. Е. New.vector), был определен заранее:

new.vector <- c()

Я ожидалчто конечная сумма для каждой строки будет присвоена вектору соответствующим образом (например, если суммы для всех строк были 1, 2, 3, 4 и т. д., то new.vector (1, 2, 3, 4 и т. д.)) но этого не произошло.

(Правка) Когда я делаю это с основными функциями, назначение работает:

new.vector[1] <- f.1()
new.vector[2] <- f.2()

Это, однако, не работает с обобщенной функцией:

new.vector[1:ncells] <- result cell[1:ncells]

(End Edit)

Я также попытался установить длину дляe new.vector должен быть равен ncells, но я не думаю, что это принесло пользу:

length(new.vector) = ncells

Мой вопрос заключается в том, как я могу заставить новый вектор принимать итоговые суммы умноженных элементовстрока матрицы по соответствующему значению вектора.

Надеюсь, я все ясно и заранее спасибо!

1 Ответ

0 голосов
/ 09 июня 2018

Здесь нет необходимости в цикле, мы можем использовать степень умножения матриц R, а затем суммировать строки с rowSums.Обратите внимание, что m и v используются в качестве имен для matrix и vector, чтобы избежать конфликта с этими именами функций.

nr <- nrow(m)
rowSums(m * matrix(rep(v, nr), nr, byrow = TRUE))
# [1] 45 39 -4 32

Однако, если вектор v всегда будет номером столбца, мы можем просто использовать функцию col в качестве нашего множителя.

rowSums(m * col(m))
# [1] 45 39 -4 32

Данные:

a <- c(4, -9, 2, -1)
b <- c(-1, 3, -8, 2)
c <- c(5, 2, 6, 3)
d <- c(7, 9, -2, 5)
m <- cbind(a, b, c, d)
v <- 1:4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...