2015-07-30 2 views
0

Если у меня есть массив соПрименить вектор-столбец для каждой строки каждой матрицы в массиве в R

> (arr = array(c(1,1,2,2), c(2,2,2))) 

, , 1 

    [,1] [,2] 

[1,] 1 2 

[2,] 1 2 

, , 2 

    [,1] [,2] 

[1,] 1 2 

[2,] 1 2 

тогда как я мог применить вектор-столбец, скажем, с (3,3), к каждой строке каждого матрицы и суммировать их? По существу, мне нужно сделать 4 * c (1,2)% *% c (3,3). Может ли использоваться функция приложения здесь?

+0

Нужно ли иметь массив или вы можете использовать список? – David

+0

Конечно, я мог бы использовать список. – norm850

+0

@nongkrong Хмм, я не думаю, что это всегда срабатывает. – norm850

ответ

0

EDITED

Это должно дать вам ответ:

l <- list(matrix(c(1,1,2,2), ncol = 2), 
     matrix(c(1,1,2,2), ncol = 2)) 
l 
#[[1]] 
# [,1] [,2] 
# [1,] 1 2 
# [2,] 1 2 
# 
# [[2]] 
# [,1] [,2] 
# [1,] 1 2 
# [2,] 1 2 


ivector <- c(3, 3) # a vector that is multiplied with the rows of each listelement 
# apply over all listelements 
res <- lapply(l, function(x, ivector){ 

    #apply to all rows of the matrizes 
    apply(x, 1, function(rowel, ivector){ 
     return(sum(rowel %*% ivector)) 
    }, ivector = ivector) 

}, ivector = ivector) 

res 
#[[1]] 
#[1] 9 9 
# 
#[[2]] 
#[1] 9 9 

# And finally sum up the results: 
sum(Reduce("+", res)) 
#[1] 36 

ли это поможет?

+0

Не совсем. Я хочу, c (1,2)% *% c (3,3) + c (1,2)% *% c (3,3) + c (1,2)% *% c (3,3) + c (1,2)% *% c (3,3), где первые два дополнения взяты из первой матрицы, а последние две являются второй матрицей. Здесь я попытаюсь изменить функцию lapply. – norm850

+0

Думаю, я понял, что это лучше? – David

+0

В R, вот как вы создаете вектор? Мне жаль, но я не знаю, как еще это объяснить. У меня есть матрица, но я просто хочу применить вектор к каждой строке и суммировать результаты. – norm850

1

Спасибо всем за помощь! Я считаю, что правильный метод

sum(apply(arr, c(1,3), function(x) x %*% c(1,2,3))) 

, которые здесь мы усеивание вектор [1,2,3] для каждой строки каждой матрицы в массиве называется обр и суммируя их. Обратите внимание, что здесь я изменил массив быть

arr = array(c(1,2,3,4,5,6,7,8,9,10,11,12), c(2,3,2)) 

arr 

, , 1 

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

[1,] 1 3 5 

[2,] 2 4 6 

, , 2 

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

[1,] 7 9 11 

[2,] 8 10 12 

и теперь вектор мы усеивание строки с собой С (1,2,3), а не с (3,3) в исходном сообщении.

+0

Вы уверены, что это работает? Я получаю ошибку 'Ошибка в x% *% c (1, 2, 3): несоответствующие аргументы', используя ваш пример – akrun

+0

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

+0

Какова будет ваша модификация для оригинала 'arr' – akrun

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