-2
votes

Comment créer une matrice Tri diagonale comme 1D

Donc, pour ma demande, je devrais créer une matrice Tri diagonale. Ceci est facile à voir avec n'importe quelle langue, vous parcourez toutes les lignes et toutes les colonnes, puis définissez les valeurs diagonales principales, les valeurs sous diagonales et les valeurs super diagonales. Habituellement, cela est effectué sur un tableau 2D.

Pour ma demande, j'ai besoin de créer un tableau 1D de "Tridiagonal". En savoir où dire que c'est: Prenez la matrice Tridiagonale 2D puis transformez-la en 1D. Je peux juste commencer par 2D puis écrivez des fonctions qui convertissent une matrice 2D en tableau 1D. Ceci, je peux faire. J'aimerais savoir si nous allons directement à un "tridiagonal" 1D? Par exemple, disons que le tableau 2D est de 10 * 10, puis mon tableau 1D serait 100 éléments, puis je devrais déterminer quel index est la principale, super et sous-diagonale.

est-il possible de faire cela? S'il vous plaît laissez-moi savoir et merci


10 commentaires

Voulez-vous stocker tous les éléments (y compris tous les zéros) ou simplement les éléments tridiagonaux (qui seraient 28 dans votre exemple 10x10).


Je voudrais stocker tous les éléments


Alors, juste une simple sérialisation? Comme iDX1D = col + rangée * colonne ?


Plutôt. Je voudrais d'abord omettre le tableau 1D, puis la boucle et choisissez quel index avoir des valeurs principales, super et sous diagonales. Le problème est que je ne sais pas comment obtenir ces indices.


C'est ce que j'ai écrit dans le commentaire précédent. La diagonale principale a col = ligne , donc idx1d = i * (1 + colonne) , où i est la ligne / colonne. Le sous-diagonal est un avant, le SuperdiaGonal en est un après.


Donc, disons que nous commençons par la 1ère rangée dans le tableau 2D. Le premier élément à (1,1) est le premier élément diagonal principal. Cela correspond à la 1ère entrée dans 1Darray: arr (1). Ainsi, en utilisant ce que vous avez écrit: i = rangée / col = 1. Ensuite, nous avons: Index = (1+ colonneCount). Cela ne nous donnerait pas 1. Par colonneCount, voulez-vous dire le nombre de colonnes dans la matrice 2D, si nous le créons? Parce que nous aurions alors (1 + 10) qui n'est pas 1, en utilisant mon exemple 10x10. S'il vous plaît laissez-moi savoir et merci


C'est pourquoi nous utilisons habituellement une indexation à base de 0. Alors rangée / col = 0 donnerait 1d index 0 (la première entrée). Row / col = 1 donnerait 1d index 1 * (10 + 1) = 11 . Etc.


Le moyen le plus simple de résoudre ce problème est de le faire. Faire le tableau 2D. Remplissez-le. Imprimez-le sur une seule ligne. Puis regardez le motif. Il devrait être assez évident.


L'élément (I1, I2) d'un réseau N x N (en Fortran, par ex. A (I1, I2)) a l'indice linéaire IND (I1, I2) = I1 + (I2 - 1) * N. Donc a (k, k) correspond à ind (k, k) = k + (k-1) * n = k (n + 1) -n, etc. A (1,1) correspond à ind (1,1 ) = 1, a (n, n) à ind (n, n) = n ^ 2. (Et pourquoi tant de bowvotes ??)


Pourquoi cette question est-elle étiquetée comme C ++ ?


3 Réponses :


0
votes

Vous pouvez simplement regarder votre tableau 1D à l'aide d'un pointeur de tableau 2D. Fortran: xxx

en C ++, la coulée est également facile.


1 commentaires

C'est la façon évidente (et préférable) de le faire, sans doute mieux que Remoder car aucune copie n'est en cours. Althoug, cette réponse ne fait pas partie de la question (si je l'ai bien compris): J'aurais besoin de déterminer quel index est la principale, super et sous-diagonale.



1
votes

Les éléments de la diagonale principale sont à l'index (i, i) et il y a de n d'entre eux; Les supra-diagonales à (i, I-1) et (i, i + 1) et il y en a n-1 (je commence à 2 et se termine respectivement à N-1).

Une option consiste à utiliser trois vecteurs et à stocker les éléments dans les index respectifs I dans ces trois vecteurs.

Vous pouvez également emballer toutes les valeurs dans un seul vecteur de longueur 3n (ou 3N-2 si vous souhaitez réserver de l'espace). Ajouter n ou 2n à l'index, en fonction de la diagonale que vous souhaitez adresser. Pour un élément (I, J), l'indice de la diagonale est donné par J-I + 2.


2 commentaires

Je ne peux pas obtenir pourquoi le bowvote ... Mais votre réponse serait plus utile si vous avez fourni du code. C'est une bonne stratégie de stockage pour ce type de données, pour être honnête.


@Rodrigorodrigues: Il s'agit d'un moyen très standard de traiter des matrices bandées.



0
votes

S'il vous plaît considérer aussi:

  • La réponse de Yvesdaoust, car il propose une meilleure stratégie de stockage: au lieu de stocker tous les éléments de la matrice tridiagonale, stockez simplement le non-zéro. Vous pouvez écrire un comportement de type dérivé pour encapsuler, si cela en vaut.

  • La réponse de Vladmirf, car une association de pointeur peut-être une meilleure approche (selon votre cas d'utilisation), de copier sur tout le tableau via Remoder , si tout ce que vous voulez est une indexation temporaire changer de commodité tout en travaillant sur les données.

    dit que, allons à ma réponse.

    • peuplement d'une matrice tridiagonale n'est pas un problème différent de la construction de n'importe quelle matrice. Je ne pense pas que ça compte vraiment ici. Il suffit de garder à l'esprit que les magasins Fortran sont des tableaux de stockage de colonnes, 1 index basé sur une commande.

    • Modification de la forme de vos données est facile et évident, si le stockage est content. Vous pouvez créer un Pointeur Association ou le transférer sur une nouvelle variable avec Remodape .

    • L'extraction de la principale, de Super et de la diagonale est également un problème trivial et peut être effectuée avec une simple manipulation du triplet d'index de réseau. Regardez: XXX


0 commentaires