Quelle est la syntaxe correcte pour appliquer une fonction aux éléments sous d'une matrice sans utiliser une boucle?

StackOverflow https://stackoverflow.com/questions/2239022

  •  19-09-2019
  •  | 
  •  

Question

J'ai défini une fonction (getDepth) qui fait quelque chose d'assez trivial, par exemple, prend dans une matrice de 2x4 et fournit une matrice de 2x1. J'ai alors une matrice 2x4xn je veux l'appliquer, et je me attends à un résultat de la matrice 2x1xn.

Quelle est la syntaxe correcte pour appliquer ma fonction à la matrice sans avoir recours à l'aide d'une boucle?

ed. Comme l'a demandé, voici un exemple de ce que je suis en train de faire:

function [bidWSize, askWSize] = getWSizes(m, bookSizeHistory)
    bidWSize = sum(bookSizeHistory(2:4, 1, m));
    askWSize = sum(bookSizeHistory(2:4, 2, m));
end

Actuellement, je suis alors en boucle et l'alimentation en sortie 2x1xn

Était-ce utile?

La solution

Vous devez écrire la fonction afin qu'il puisse gérer les matrices de nx2x4. En effet, si elle fait quelque chose de trivial, il ne devrait pas être trop difficile. Si vous avez des problèmes avec cela, vous pouvez poster ici et demander de l'aide.

EDIT:

somme est une fonction qui fonctionne bien avec des matrices, de sorte que vous pouvez réaliser ce que vous voulez en faisant la somme un peu plus de la matrice, et en jouant avec les dimensions. vous n'avez pas besoin de la fonction du tout:

sum(bookSizeHistory(2:4, 1:2, :))

sommes sur la 1ère dimension (comme ce que vous faites dans la fonction), donc en supposant la taille de bookSizeHistory est Kx2xN, la sortie de cette somme est 1x2xN. vous pouvez ajouter un permute pour réorganiser les dimensions comme vous souhaitez:

permute(sum(bookSizeHistory(2:4, 1:2, :)), [2 1 3])

devrait vous donner ce que vous avez besoin.

Autres conseils

Vous pouvez exécuter des fonctions sur les éléments individuels en utilisant le « » opérateur. Par exemple, amener chaque élément à une certaine puissance, vous pouvez utiliser:

C=A.^B;

Au lieu de:

[rows,cols]=size(A);
for i=1:rows
    for j=1:cols
        C=A(i,j)^B;
    end
end

Cela donne un code beaucoup plus court qu'une boucle avec les mêmes résultats. Il est généralement appelé code « vectorisé », qui tire profit des fonctions BLAS. Dans le cas contraire Matlab est plus comme un langage interprété, ce qui est beaucoup plus lent. D'autres fonctions effectuent des opérations sur toutes les lignes ou colonnes dans un tableau. Si A était un tableau 2-D (2,4), la somme (A) donnerait la somme de chaque colonne. Lorsque la somme totale pourrait trouver quelques façons différentes:

A_temp=reshape(A,[1,8]);
B=sum(A_temp);

ou

A=sum(sum(A));

Il peut y avoir d'autres fonctionnalités dans la commande de somme qui permet de le faire avec un seul appel avec un argument supplémentaire, mais cela est encore un moyen décemment rapide de le faire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top