Utiliser un vecteur comme index d'une matrice
Je suis en train d'écrire une fonction MATLAB pour la lecture de données dans un n-dimensions tableau (variable taille de dimension). J'ai besoin d'être en mesure d'accéder à un point spécifique dans la Matrice (l'écriture ou de lecture, par exemple), mais je ne sais pas à l'avance combien d'indices à préciser.
Actuellement, j'ai un current_point
vecteur qui je parcourir pour spécifier chaque indice, et un max_points
vecteur qui indique la taille de la matrice. Ainsi, si par exemple je voulais en 3 dimensions, tableau de taille 1000-par-15-par-3, max_points = [1000 15 3]
et current_point
itère de [1, 1, 1]
à [1000, 15, 3]
([1, 1, 1]
-> [1000, 1, 1]
-> [1, 2, 1]
-> [1000, 2, 1]
->...). Ce que je voudrais être en mesure de faire est de nourrir current_point
comme un indice de la matrice comme suit:
output_matrix(current_point) = val
Mais apparemment, quelque chose comme output_matrix([1 2 3]) = val
va juste mettre outputmatrix(1:3) = 30
. Je ne peut pas utiliser de variables muettes parce que parfois, la matrice aurez besoin de 3 indices, d'autres fois 4, d'autres fois 2, etc, donc un vecteur de longueur variable est vraiment ce dont j'ai besoin ici. Est-il une façon simple d'utiliser un vecteur de points dans un indice?
source d'informationauteur Paul
Vous devez vous connecter pour publier un commentaire.
À l'aide de la fonction
sub2ind
pour créer un linéaire de l'indice de est la solution classique à ce problème, comme le montre cette étroitement liés à la question. Vous pouvez également calculer un linéaire de l'indice de vous-même au lieu de l'appelersub2ind
.Cependant, votre cas peut être plus simple que ceux des autres questions que j'ai mentionnées. Si vous n'êtes jamais à l'indexation d'un unique point avec votre
current_point
vecteur (c'est à dire c'est juste un n-élément de vecteur d'indices dans votre n-dimensions de la matrice), alors vous pouvez utiliser une solution simple où vous convertircurrent_point
à une cellule de tableau des indices à l'aide de la fonctionnum2cell
et l'utiliser pour créer un liste séparée par des virgules d'indices. Par exemple:L'opération
subCell{:}
crée l'équivalent de tapersubCell{1}, subCell{2}, ...
qui est l'équivalent de tapercurrent_point(1), current_point(2), ...
.Je sais que c'est trop tard, mais pour quelqu'un qui va trouver ce sujet. la manière la plus simple qui fonctionne pour moi est d'utiliser:
diag(A (x(:),y(:)) )
;malheureusement, cela ne fonctionne que si vous avez besoin d'obtenir des valeurs de la matrice, et non pas pour changer les valeurs
Vous pouvez utiliser le
sub2ind
fonction permettant d'obtenir le linéaire de l'indice de l'indice.Exemple:
Dans l'exemple ci-dessus, j'ai stocké les indices (peut être n'importe quel nombre de dimensions) comme un
cell
. Si vous l'avez stocké comme un vecteur, il suffit d'utilisernum2cell()
pour la convertir en une cellule.Désormais, vous pouvez facilement attribuer une valeur à ce que
A(indx)=value;
. J'ai utilisé différentes variables que les vôtres, la réponse générale, mais l'idée est la même et vous avez juste besoin de remplacer les noms de variable.Vous avez également mentionné dans votre message que vous êtes en boucle à partir de
(1,1,1)
jusqu'à une certaine valeur,(1000,15,3)
et l'affectation d'une valeur à chacun de ces points. Si vous êtes à la boucle le long des colonnes, vous pouvez remplacer cette opération avec un vectorisé solution.Laisser
finalElement={1000,15,3}
être la dernière étape de la boucle. Comme avant, trouver le linéaire de l'indice deMaintenant, si vous avez les valeurs que vous attribuez à la boucle stockée comme un vecteur unique,
values
vous pouvez simplement l'affecter en une seule étape comme