le fractionnement d'une Matrice en vecteurs colonnes et de les stocker dans un tableau
Ma question est en deux parties:
- Split une matrice donnée dans ses colonnes
- Ces colonnes doivent être stockées dans un tableau
par exemple,
A = [1 3 5
3 5 7
4 5 7
6 8 9]
Maintenant, je sais que la solution de la première partie:
les colonnes sont obtenus via
tempCol = A(:,iter), where iter = 1:end
Qui concerne la seconde partie du problème, je voudrais avoir (quelque chose comme ça, peut-être une autre indexation dans arraySplit tableau), mais un plein de colonnes de A doit être stocké à un indice unique dans splitArray:
arraySplit(1) = A(:,1)
arraySplit(2) = A(:,2)
et ainsi de suite...
pour l'exemple de la matrice A
,
arraySplit(1)
devrait me donner [ 1 3 4 6 ]'
arraySplit(2)
devrait me donner [ 3 5 5 8 ]'
J'obtiens l'erreur suivante, quand j'ai essayé d'affecter le vecteur colonne de mon tableau.
In an assignment A(I) = B, the number of elements in B and I must be the same.
Je suis en train de faire la répartition et l'accès de arraySplit
à tort, s'il vous plaît aidez-moi ...
- Une matrice est déjà un tableau de vecteurs, pourquoi avez-vous besoin de cette inutile
arraySplit
sophistication? - Ce qui frappe habituellement les nouveaux utilisateurs de matlab est l'absence totale de pointeurs: voir ceci et ceci des questions. Outre les tableaux de cellules qui ne sont pas utile à mon humble avis, vous avez à vivre sans les pointeurs et l'adapter à votre style de codage à cette contrainte. En fait ce que vous demandez est un tableau de pointeurs de sorte que
A(i,j)==arraySplit(j)(i)
mais ce n'est pas possible avec()
parenthèses. - Je trouve chaque partie de votre commentaire mal: 1) Pas tous les "nouveaux utilisateurs de MATLAB" proviennent d'un C en arrière-plan, donc en disant qu'ils n'ont pas la fonctionnalité d'emplacements mémoire et les pointeurs n'est pas nécessairement vrai. 2) des cellules de tableaux sont TRÈS utiles pour contenir des données de type de variable comme une collection, tels que des nombres et des chaînes, ou des vecteurs de longueur différente. 3) Pourquoi êtes-vous certain que l'OP veut pointeurs plutôt que d'une copie de ces vecteurs?
- désolé pour la cause de la désapprobation de vous. Fondamentalement, vous avez raison, mon bref commentaire suppose que lorsque l'OP demande "à une colonne entière de A doit être stocké à un indice unique dans splitArray", il demande un C-like tableau de tableaux. Comme quoi ce matrices de cellules, je l'aurais écrit qu'ils ne sont pas si utiles que le pointeur de substituts. Le sens de mon commentaire était simplement de faire connaître l'OP que dans MATLAB le modèle de données pour les matrices (et N-dimension tableau) est très différente de C et de numpy.
- Je ne voulais pas agressif, mais il est important de noter cette information afin de ne pas induire en erreur l'OP.
Vous devez vous connecter pour publier un commentaire.
Vraiment, ça sonne comme
A
est alread ce que vous voulez, je ne peux pas imaginer un scénario où vous gagnez rien en les scindant en place. Mais si vous le faites, alors votre meilleur pari est probablement une cellule de tableau, c'est à dire.Edit: Voir @EitanT de commentaire ci-dessous pour une façon plus élégante de le faire. Également accès au vecteur utilise la même syntaxe que pour fixer, par exemple,
v = C{2};
va mettre la deuxième colonne deA
env
.C = mat2cell(A, size(A, 1), ones(1, size(A, 2)))
. Aussi, vous devriez probablement vous expliquer comment accéder à chaque colonne en utilisant les accolades.Dans un Matlab tableau, chaque élément doit avoir le même type. Dans la plupart des cas, c'est un type float. Un votre exemple A(:, 1) est un 4 en 1 tableau. Si vous attribuez à, disons, B(:, 2), alors B(:, 1) doit aussi être un 4 en 1 tableau.
Une erreur courante qui peut être à vous mordre est un 4 en 1 tableau et un 1 par 4 tableau sont pas la même chose. L'un est un vecteur colonne et est un vecteur ligne. Essayez de transposition d'Une(:, 1) pour obtenir un 1 par 4 ligne tableau.
Vous pouvez essayer quelque chose comme ce qui suit:
et ensuite appeler
arraySplit(:,:,1)
pour obtenir le premier vecteur, mais qui semble être une étape inutile, puisque vous pouvez facilement le faire en accédant à exactement les mêmes valeurs queA(:,1)
.