Quelle est la meilleure façon de construire une matrice dont les éléments sont exactement leurs indices dans Matlab?
Edit: Les réponses existantes à cette question sont applicables à la construction d'une matrice dont les éléments sont fonctions em> de leurs indices. J'ai donc ajouté que au titre de la question. P> Le format peut être une matrice avec des vecteurs en tant qu'éléments, ou comme deux matrices, stockant chacun un index. P> à la fin , Je voudrais créer une matrice dont les éléments sont des fonctions de leurs indices. Donc, une méthode efficace pour cela (mais éventuellement différente) est très appréciée. Tout commentaire sur l'efficacité est la bienvenue. P> La taille des matrices a tendance à être grande (dimension des centaines de centaines carré au minimum) pour mes applications. En conséquence, des méthodes qui tirent parti des fonctions natives Matlab sont probablement beaucoup meilleures que pour / tandis que les boucles. p> Par exemple, pour une matrice de taille [2 2], je voudrais apporter soit P>
matrixIneed = arrayfun(@(i,j)..., X,Y)
5 Réponses :
Utiliser (la différence de votre cas 2D est que de la Bien il n'y a pas beaucoup plus d'expliquer, retourne: p> Meshgrid code> ou
ndgrid code>:
y code > et
x code> sont échangés. - Utilisez-le en fonction de vos besoins.) p>
[x, y] = meshgrid (xgv, ygv) code> réplique les vecteurs de la grille
xgv code> et
ygv code> à
produire une grille complète. Cette grille est représentée par la coordonnée de sortie
tableaux
x code> et
y code>. Les matrices de coordonnées de sortie
x code> et
y code> contiennent
Copies des vecteurs de la grille
xgv code> et
ygv code> respectivement. La taille du
Les matrices de sortie sont déterminées par la longueur des vecteurs de la grille. Pour
vecteurs de grille
xgv code> et
ygv code> de longueur
m code> et
n code> respectivement,
x code> et < code> y code> sera
avoir
n code> lignes et
m code> colonnes. p>
blockQuote>
MeshGrid CODE> est utilisé pour créer une grille régulière à partir de deux vecteurs, généralement "
x code>" et "code" et " > Y code> "Valeurs afin d'obtenir des données d'entrée appropriées pour un graphique 3D / code codé de
z code> -Data. Si vous supposez votre
x code> et
y code> pour être les vecteurs
[1 2 3 ... N] code> Cela fait exactement ce dont vous avez besoin. p>
Bonjour, je suis un peu confus avec Meshgrid. Pourriez-vous expliquer pourquoi MeshGrid fonctionne dans ce cas dans votre réponse s'il vous plaît?
@Argyll: J'ai ajouté des explications, j'espère que cela vous aide.
Une autre option à l'aide de repmat code> (puisque le contenu de ces matrices est redondant):
Regardez le Dans votre cas, on dirait que vous le souhaitez. (Je pense que vous voulez que vous voulez des "indices" au lieu d'indices "Matlab utilise" l'index "pour signifier l'index" linéaire "d'un élément lors de la visualisation de la matrice en tant que vecteur unidimensionnel et" sous-domests "pour signifier la position sur chaque dimension d'un tableau multidimensionnel.) p> Le ind2sub code>,
Sub2ind code> et
Remodape code> fonctions. Ils sont utiles pour transformer des sous-domes et des index sur des tableaux multidimensionnels.
MeshGrid code> Approche que @ThewayWalk a donné produira la même sortie, mais je pense que le
Ind2SUB CODE> L'approche est un peu plus lisible dans ce cas, car elle est libellée en termes d'indexation de tableau, qui est votre domaine de problème. Et il généralisera de travailler sur des tranches ou des sous-ensembles arbitraires de tableaux, que
MeshGrid code> ne sera pas, et correspond bien à
Ind2SUB code> pour des opérations efficaces qui se passent dans l'autre sens. (Ça vaut la peine d'apprendre
Meshgrid code> de toute façon cependant; il apparaît dans d'autres endroits.) P> p>
Salut Andrew, c'est en fait ma première tentative aussi! (MeshGrid était et me confond toujours ..) Avez-vous aussi savoir comment remodeler () effectue-t-il?
Remoder est très rapide. Il ne change pas du tout la matrice de données primitive sous-jacente; Il vient de réécrire les dimensions de l'en-tête de la structure "MXARRAY" C qui implémente la matrice dans l'interpréteur MATLAB, réécrit éventuellement la matrice s'il est partagé par copie-ware. C'est à peu près aussi vite que les fonctions Matlab obtiennent.
Utilisez-vous à ndgrid code>
. Évitez MeshGrid code>
, sauf en faveur du tracé et les opérations graphiques.
la sortie de ndgrid code>, exprimée en termes de lignes, de colonnes, etc., a plus de semenatics naturels pour les opérations matriciels MATLAB que les coordonnées X, Y, comme retourné par
MeshGrid code>. p>
>> inds = sub2ind([nrows ncols],II,JJ)
inds =
1 4 7 10
2 5 8 11
3 6 9 12
Étant donné que vous avez indiqué que vous souhaitez exécuter une fonction sur les indices, il est de loin le plus facile et probablement le plus rapide de simplement faire une double boucle: en fonction d'un bit sur Si vous exécutez MATLAB R2009 ou ultérieure, et votre fonction est intégrée ou peut être construite à l'aide de Construits uniquement, le temps d'exécution de ces boucles vs. code> MeshGrid sera comparable, mais Parfois, cela aide également: P> myfunction code>, il est probable que cela soit plus rapide que
arrayfun code>, et certainement beaucoup moins de mémoire intensive que
Meshgrid code> lorsque
n code> ou m code> sont relativement grands; Voir aussi Cette question connexe a >. P>
MeshGrid Code> consommera beaucoup plus de mémoire (O (N ° S) par opposition à O (1) pour la boucle). Comme toujours, le profilage est essentiel, mais la double boucle est probablement la meilleure solution complète. p>
matrixIneed = zeros(n*m,1);
for ij = 1:n*m
%// use this when possible
matrixIneed(ij) = myFunction(ij);
%// otherwise, use this
matrixIneed(ij) = myFunction(mod(ij-1,n)+1, floor((ij-1)/n)+1);
end
reshape(matrixIneed,n,m);
J'utilise R2011a. Et j'ai trouvé des boucles très lents. Par exemple, avec une matrice d'un million d'éléments, la fonction intégrée moyenne () code> est d'environ 50 fois plus rapide qu'une boucle, même si une boucle enregistre la mémoire. Probable,
rand () code> environ 50 fois plus rapide lors de la production directement d'un tableau de nombres aléatoires par rapport à une boucle. J'ai eu une fonction personnalisée à 1 paramètre (qui est une composition d'opérations arithmétiques élémentaires) qui effectue environ 50 fois plus vite si l'entrée est une matrice (no
arrayfun code> est nécessaire dans ce cas) par rapport à une boucle .
Trois années 50 ajoutent pour faire la différence entre une simulation étant suffisamment précise ou non, ou une simulation étant faisable ou non. Un million était encore trop petit pour moi à l'époque. Alors la mémoire importe. Et je devais plutôt boucler sur des matrices pour accomplir la tâche sans écraser mon ordinateur. Donc, votre réponse vient comme une surprise pour moi. N'avez-vous pas rencontré des problèmes similaires avec Matlab Loops?