6
votes

Comment mieux construire une matrice dont les éléments sont exactement leurs indices ou leurs fonctions des indices dans Matlab?

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)


0 commentaires

5 Réponses :


7
votes

Utiliser Meshgrid ou ndgrid : xxx

(la différence de votre cas 2D est que y et x sont échangés. - Utilisez-le en fonction de vos besoins.)

de la Documentation :

[x, y] = meshgrid (xgv, ygv) réplique les vecteurs de la grille xgv et ygv à produire une grille complète. Cette grille est représentée par la coordonnée de sortie tableaux x et y . Les matrices de coordonnées de sortie x et y contiennent Copies des vecteurs de la grille xgv et ygv 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 et ygv de longueur m et n respectivement, x et < code> y sera avoir n lignes et m colonnes.

Bien il n'y a pas beaucoup plus d'expliquer, MeshGrid est utilisé pour créer une grille régulière à partir de deux vecteurs, généralement " x " et "code" et " > Y "Valeurs afin d'obtenir des données d'entrée appropriées pour un graphique 3D / code codé de z -Data. Si vous supposez votre x et y pour être les vecteurs [1 2 3 ... N] Cela fait exactement ce dont vous avez besoin.

retourne: xxx


2 commentaires

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.



0
votes

Une autre option à l'aide de repmat (puisque le contenu de ces matrices est redondant): xxx


0 commentaires

3
votes

Regardez le ind2sub , Sub2ind et Remodape fonctions. Ils sont utiles pour transformer des sous-domes et des index sur des tableaux multidimensionnels.

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.) xxx

Le MeshGrid Approche que @ThewayWalk a donné produira la même sortie, mais je pense que le Ind2SUB 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 ne sera pas, et correspond bien à Ind2SUB pour des opérations efficaces qui se passent dans l'autre sens. (Ça vaut la peine d'apprendre Meshgrid de toute façon cependant; il apparaît dans d'autres endroits.)


2 commentaires

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.



4
votes

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


0 commentaires

1
votes

2 commentaires

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 () est d'environ 50 fois plus rapide qu'une boucle, même si une boucle enregistre la mémoire. Probable, rand () 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 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?