2016-05-03 1 views
1

J'ai un tableau 6,6,51 et une matrice 51,6. Je veux multiplier la ligne 1 de la matrice 1 dans le tableau, par la ligne 1 dans la matrice et ensuite stocker cela comme résultat. Je voudrais le faire à nouveau pour chaque ligne de chaque matrice contenue dans le tableau. Donc, je prendrais la deuxième rangée de la première matrice dans le tableau et la multiplierais par la première rangée de la matrice. Une fois que j'ai parcouru les 6 rangées de la première matrice du tableau, j'aimerais faire exactement la même chose sur les 50 matrices restantes du tableau.Tableau multiplié par des lignes individuelles dans la matrice

Pour aider à l'exposition de ce que je demande, je vais donner un exemple raccourci en utilisant un tableau 6,6,3 et une matrice 3,6. Je vais faire quelques chiffres il est donc plus facile de regarder:

array1 <- array(1:108, c(6,6,3)) 

[,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 1 7 13 19 25 31 
[2,] 2 8 14 20 26 32 
[3,] 3 9 15 21 27 33 
[4,] 4 10 16 22 28 34 
[5,] 5 11 17 23 29 35 
[6,] 6 12 18 24 30 36 

, , 2 

    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 37 43 49 55 61 67 
[2,] 38 44 50 56 62 68 
[3,] 39 45 51 57 63 69 
[4,] 40 46 52 58 64 70 
[5,] 41 47 53 59 65 71 
[6,] 42 48 54 60 66 72 

, , 3 

    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 73 79 85 91 97 103 
[2,] 74 80 86 92 98 104 
[3,] 75 81 87 93 99 105 
[4,] 76 82 88 94 100 106 
[5,] 77 83 89 95 101 107 
[6,] 78 84 90 96 102 108 

matrix1 <- matrix(1:18, nrow = 3, ncol = 6) 

    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 1 4 7 10 13 16 
[2,] 2 5 8 11 14 17 
[3,] 3 6 9 12 15 18 

Essentiellement, je voudrais faire:

ligne1 de la matrice 1 dans array1 x row1 de matrice1

1*1 + 7*4 + 13*7 + 19*10 +25*13 + 31*16 = result 

puis faire row2 de matrix1 dans array1 x row1 de matrix1

etc etc jusqu'à ce que la ligne 6 de matrix1 dans array1

puis répétez sur la matrice 2 du tableau 1 en utilisant la ligne 2 de la matrice1

Est-ce que cela est intelligible?

Si oui, quelqu'un peut-il vous aider?

Est-il possible de séparer la matrice 1 en vecteurs? Donc, je pourrais juste obtenir 51 vecteurs séparés à multiplier contre chaque tableau?

Cordialement

+0

Cela ressemble à R. Si oui, identifiez-le comme tel. Si ce n'est pas le cas, marquez-le avec l'étiquette de langue appropriée. –

+0

Etes-vous sûr de la taille de la matrice? Ne devrait-il pas être 6 x 6? Parce que si nous avons un tableau de dimensions 6 x 6 x 51, alors il y aura 51 matrices de 6 x 6. Et si votre question est correcte, vous demandez de multiplier une matrice 6 x 51 avec une matrice 6 x 6. –

+1

Si la dimension de la matrice est 6 x 6 comme Kunal Puri l'a suggéré, la solution serait probablement: '' apply (array1, 3, function (x) rowSums (matrice1 * x)) '' – Phann

Répondre

0

Ok, comme je ne suis toujours pas sûr si vous voulez dire 6 x 3 matrice ou 6 x 6 matrice, ici vient d'une solution pour les deux cas (similaire à mon commentaire):

Rows <- min(dim(array1)[1], dim(matrix1)[1]) 
Cols <- min(dim(array1)[2], dim(matrix1)[2]) 

apply(array1, 3, function(x) rowSums(matrix1 * x[1:Rows,1:Cols])) 

D'autres lignes et colonnes de array1 ne correspondant pas à matrix1 sont ignorées alors.

Une brève explication sur la façon d'accéder à la solution: Prenez le premier plan de la matrice et expérimentez pour obtenir la solution souhaitée.

array1[ , , 1] * matrix1 #or array1[1:Rows, 1:Cols, 1] * matrix1 

rowSums donne, comme prévu par son nom, la somme de chaque ligne. Donc le résultat pour le premier plan dans le tableau multiplié avec la matrice et résumé est un vecteur.

rowSums(array1[1:Rows, 1:Cols, 1] * matrix1) 
# 1131 1284 1449 

Le résultat semble être correct, nous pouvons maintenant apply cette solution sur chaque matrice du tableau comme indiqué dans le haut de la réponse.