De nombreuses opérations intégrées telles que sum
et prod
sont déjà capables de fonctionner sur des lignes ou des colonnes, vous pourrez donc peut-être refactoriser la fonction que vous appliquez pour en tirer parti.
Si ce n'est pas une option viable, une façon de le faire est de collecter les lignes ou les colonnes dans des cellules à l'aide de mat2cell
ou num2cell
, puis de l'utiliser cellfun
pour opérer sur le tableau de cellules résultant.
À titre d'exemple, disons que vous souhaitez additionner les colonnes d'une matrice M
. Vous pouvez le faire simplement en utilisant sum
:
M = magic(10); %# A 10-by-10 matrix
columnSums = sum(M, 1); %# A 1-by-10 vector of sums for each column
Et voici comment procéder en utilisant l' option num2cell
/ plus compliquée cellfun
:
M = magic(10); %# A 10-by-10 matrix
C = num2cell(M, 1); %# Collect the columns into cells
columnSums = cellfun(@sum, C); %# A 1-by-10 vector of sums for each cell
true = false
est une déclaration valide, je suis sûr qu'il y a un moyen de le faire (:sum(M, 1)
. Les débutants pourraient penser que celasum
peut être utilisé de cette façon pour des matrices de taille arbitraire, puis être perplexes lorsque la matrice l'est un jour1-by-n
.Vous voudrez peut-être la fonction plus obscure de Matlab bsxfun . D'après la documentation Matlab, bsxfun "applique l'opération binaire élément par élément spécifiée par le descripteur de fonction fun aux tableaux A et B, avec l'expansion des singleton activée."
@gnovice a déclaré ci-dessus que la somme et d'autres fonctions de base fonctionnent déjà sur la première dimension non singleton (c'est-à-dire, des lignes s'il y a plus d'une ligne, des colonnes s'il n'y a qu'une seule ligne, ou des dimensions supérieures si les dimensions inférieures ont toutes une taille == 1 ). Cependant, bsxfun fonctionne pour n'importe quelle fonction, y compris (et surtout) les fonctions définies par l'utilisateur.
Par exemple, disons que vous avez une matrice A et un vecteur ligne BEg, disons:
Vous voulez une fonction power_by_col qui renvoie dans un vecteur C tous les éléments de A à la puissance de la colonne correspondante de B.
D'après l'exemple ci-dessus, C est une matrice 3x3:
c'est à dire,
Vous pouvez le faire à la manière de la force brute en utilisant repmat:
Ou vous pouvez le faire de manière élégante en utilisant bsxfun, qui s'occupe en interne de l'étape repmat:
Ainsi, bsxfun vous évite quelques étapes (vous n'avez pas besoin de calculer explicitement les dimensions de A). Cependant, dans certains de mes tests informels, il s'avère que repmat est environ deux fois plus rapide si la fonction à appliquer (comme ma fonction power, ci-dessus) est simple. Vous devrez donc choisir si vous voulez la simplicité ou la rapidité.
la source
Je ne peux pas dire à quel point c'est efficace, mais voici une solution:
la source
Sur la base de la réponse d'Alex , voici une fonction plus générique:
Voici une comparaison entre les deux fonctions:
la source
Par souci d'exhaustivité / intérêt, j'aimerais ajouter que matlab a une fonction qui vous permet d'opérer sur des données par ligne plutôt que par élément. Il s'appelle
rowfun
( http://www.mathworks.se/help/matlab/ref/rowfun.html ), mais le seul "problème" est qu'il fonctionne sur des tables ( http://www.mathworks.se/help/ matlab / ref / table.html ) plutôt que des matrices .la source
Ajoutant à la nature évolutive de la réponse à cette question, en commençant par r2016b, MATLAB élargira implicitement les dimensions singleton, supprimant le besoin
bsxfun
dans de nombreux cas.À partir des notes de version r2016b :
la source
Aucune des réponses ci-dessus n'a fonctionné "hors de la boîte" pour moi, cependant, la fonction suivante, obtenue en copiant les idées des autres réponses fonctionne:
Il prend une fonction
f
et l'applique à chaque colonne de la matriceM
.Donc par exemple:
la source
Avec les versions récentes de Matlab, vous pouvez utiliser la structure de données Table à votre avantage. Il y a même une opération `` rowfun '' mais j'ai trouvé plus simple de le faire:
ou voici un ancien que j'avais qui ne nécessite pas de tables, pour les anciennes versions de Matlab.
la source
La réponse acceptée semble être de convertir d'abord en cellules, puis de l'utiliser
cellfun
pour fonctionner sur toutes les cellules. Je ne connais pas l'application spécifique, mais en général, je pense qu'utiliserbsxfun
pour opérer sur la matrice serait plus efficace. Applique essentiellementbsxfun
une opération élément par élément sur deux tableaux. Donc, si vous souhaitez multiplier chaque élément d'unn x 1
vecteur par chaque élément d'unm x 1
vecteur pour obtenir unn x m
tableau, vous pouvez utiliser:Cela vous donnera une matrice appelée
result
dans laquelle l'entrée (i, j) sera le ième élément devec1
multiplié par le jème élément devec2
.Vous pouvez utiliser
bsxfun
pour toutes sortes de fonctions intégrées, et vous pouvez déclarer les vôtres. La documentation contient une liste de nombreuses fonctions intégrées, mais en gros, vous pouvez nommer n'importe quelle fonction qui accepte deux tableaux (vecteur ou matrice) comme arguments et la faire fonctionner.la source
Je suis tombé sur cette question / réponse en cherchant à calculer les sommes de ligne d'une matrice.
Je voudrais juste ajouter que la fonction SUM de Matlab prend en charge la sommation pour une dimension donnée, c'est-à-dire une matrice standard à deux dimensions.
Donc, pour calculer les sommes des colonnes, faites:
et pour les sommes en ligne, faites simplement
Mon pari est que c'est plus rapide que de programmer une boucle for et de convertir en cellules :)
Tout cela peut être trouvé dans l'aide de matlab pour SUM.
la source
si vous connaissez la longueur de vos lignes, vous pouvez faire quelque chose comme ceci:
la source