1

Soit A une matrice avec [m x n] éléments et B une autre matrice avec [m x n x o] éléments. Existe-t-il une méthode algébrique linéaire pour ajouter les deux matrices de sorte que C = A + BC sera dans [m x n x o] sans aucune sorte de boucle le long de la dimension o?Ajout de deux matrices de dimensions différentes

Exemple:

Soit

A =

1  2  5  6 
1  2  3  4 
1  5  8  9 

et

B (:,:, 1) =

1  1  1  1 
1  1  1  1 
1  1  1  1 

B (:,: , 2) =

1  1  1  1 
1  1  1  1 
1  1  1  1 

B (:,:, 3) =

1  1  1  1 
1  1  1  1 
1  1  1  1 

C = A + B

C (:,:, 1) =

2  3  6  7 
2  3  4  5 
2  6  9 10 

C (: ,:, 2) =

2  3  6  7 
2  3  4  5 
2  6  9 10 

C (:,:, 3) =

2  3  6  7 
2  3  4  5 
2  6  9 10 
+0

À quoi la sortie est-elle censée ressembler? –

+0

Veuillez faire un exemple. – timgeb

+2

Est-ce MATLAB ou python? –

Répondre

4

Ceci est facile à faire dans Numpy: il développera automatiquement A pour vous.

import numpy as np 

a = np.array([[1, 2, 5, 6], [1, 2, 3, 4], [1, 5, 8, 9]]) 
print(a, end='\n\n') 

b = np.ones((3, 3, 4), dtype='int32') 
print(b, end='\n\n') 

c = b + a 
print(c) 

sortie

[[1 2 5 6] 
[1 2 3 4] 
[1 5 8 9]] 

[[[1 1 1 1] 
    [1 1 1 1] 
    [1 1 1 1]] 

[[1 1 1 1] 
    [1 1 1 1] 
    [1 1 1 1]] 

[[1 1 1 1] 
    [1 1 1 1] 
    [1 1 1 1]]] 

[[[ 2 3 6 7] 
    [ 2 3 4 5] 
    [ 2 6 9 10]] 

[[ 2 3 6 7] 
    [ 2 3 4 5] 
    [ 2 6 9 10]] 

[[ 2 3 6 7] 
    [ 2 3 4 5] 
    [ 2 6 9 10]]] 

Pour les détails sur la façon gère Numpy combinant des tableaux de formes différentes s'il vous plaît voir les Numpy Broadcasting docs.


Ce code ne fonctionnera quel que soit le contenu de b sont, je viens d'utiliser un tableau de ceux pour correspondre à vos données d'échantillon.Cependant, si vous voulez juste c être une matrice mx n x o créée en développant a puis en ajoutant un à tous les éléments que vous n'avez même pas besoin de créer b; vous pouvez le faire à la place:

c = np.tile(a, (3, 1, 1)) + 1 
0

Vous pouvez simplement les ajouter, en indiquant la position de la dimension manquante (o). Voici un exemple python utilisant numpy tableaux:

import numpy as np 

>> arr_a = np.random.rand(2, 2) 
array([[ 0.461715 , 0.57055533], 
    [ 0.16992256, 0.93994827]]) 

>> arr_b = np.random.rand(2, 2, 2) 
array([[[ 0.71475233, 0.26140088], 
    [ 0.1469756 , 0.20147053]], 

    [[ 0.18321165, 0.46292277], 
    [ 0.07598337, 0.51653255]]]) 
# First generating an array with dimension [m * n * o], quickest to directly copy arr_b 
>> arr_c = arr_b.copy() 
# Placing array a in the zeroth column of the third dimension 
>> arr_c[:, :, 0] += arr_a 
array([[[ 1.17646733, 0.26140088], 
    [ 0.71753093, 0.20147053]], 

    [[ 0.35313422, 0.46292277], 
    [ 1.01593163, 0.51653255]]]) 
5

Dans ce Matlab peut être fait en utilisant l'expansion implicite (à partir R2016b) ou bsxfun(@plus,...).

qui suit travaillerait dans les versions récentes de MATLAB®:

C = bsxfun(@plus,A,B); 

Dans NumPy, ce comportement est connu sous le nom de "radiodiffusion".

0

Comme Dev-il souligné, les solutions optimales pour Matlab sont: (2016b) utiliser l'expansion implicite (C=A+B), ou (2016A et plus) utiliser bsxfun(@plus,A,B). Cependant, si vous débutez avec MATLAB, l'utilisation de bsxfun peut être difficile à comprendre. Une troisième solution est plus simple (pour moi) de comprendre le plan conceptuel, mais informatiquement moins efficace est d'utiliser repmat pour développer la matrice A à la taille de la matrice B.

C = repmat(A,[1,1,o]) + B 

Notez que l'utilisation bsxfun ou l'expansion implicite est préférée à utiliser repmat pour l'efficacité de calcul; Je ne fais que souligner cette option parce que j'ai eu du mal à comprendre bsxfun quand j'ai commencé avec MATLAB.