inspiré par laisse-moi essayer de le formaliser: em> p>
un Les dimensions dimension cible Si Vous pouvez choisir une taille optimale pour le conteneur N-dimensionnel. P>
Je n'ai besoin d'aucun code de travail entièrement de travail. Je demande s'il y a un algorithme qui fait cela? P> arr2d [i] [j] code> et arr1d [i * k + j] code> Après avoir lu Ce message et les commentaires sous elle, j'aimerais connaître un algorithme qui peut modifier les dimensions de tout tableau. P>
M code> -Dimensional A code> p> li>
d code> du conteneur (taille) p> li>
n code> p> li>
ol>
n> 0 code> renvoie ensuite un conteneur N-dimensionnel B code> avec le même contenu que A code> dans la commande, renvoyer un code d'erreur. p>
4 Réponses :
convertit [100] en [10] [10]:
#include <iostream>
typedef int (*parray)[10];
parray foo (int *in) {
return (parray)in;
}
int main()
{
int in[100];
in[55] = 42;
int (*out)[10] = foo(in);
std::cout << out[5][5] << std::endl;
return 0;
}
Casse au moins strict règle d'aliasing, et donc ub.
Je ne pouvais toujours pas comprendre cela, peut-être que typedef et fonctionne. Pourriez-vous s'il vous plaît expliquer?
Comme @jarod souligne, vous ne voulez pas faire cela sauf comme un exercice à ce sujet. Il résume 100 INTS de 100x1 à 10x10 à l'aide de la coulée. Les tableaux sont juste adresses à l'arithmétique sous le capot.
Oh je vois @ stark merci. Avez-vous une idée de la raison pour laquelle la question a des bowvotes?
Aucune idée. Je suis un peu surpris que je n'en ai pas eu.
@Stark parce que "cette question ne montre pas d'effort de recherche" ... J'étais simplement curieuse de savoir s'il existait un tel algorithme après avoir eu un Discussion à ce sujet dans une section de commentaire de ce site même. Ce n'était pas comme un problème de devoirs, et je pense que de nombreux commentaires ont été retirés de là.
VOTRE INSTRUCTION Nous voulons créer un nouveau conteneur code> -Dimensional Nous devons d'abord comprendre un mappage où nous pouvons facilement trouver le même élément dans Utilisez quelques exemples pour déduire comment le mappage pourrait être: p> (4) strong> m = 4, n = 1 p> Si A a m Dimensions A1, A2, ..., AM et B a N Dimensions B1, B2, ..., Bn, nous pouvons dire que: P> si m> n, puis pour tous 0
BlockQuote> De cette façon, nous savons créer B et la taille de chaque dimension. p> avec la fonction de mappage indiquée dans les exemples, vous pouvez facilement convertir n'importe quelle matrice Si M CODE> -DIMENSIONNEL est A CODE>. B code> qui détiendra tout le contenu de A code>. p> A code > et dans b code>. p>
M code> -Idimension sur une matrice N code> -Dimension. p> m
Et si m a k facteurs et n> k?
Avec des facteurs que vous entendez des dimensions? Dans ma réponse, il y a déjà l'explication de cela. Si m code> a moins de dimensions que n code>, vous faites simplement la même chose dans la direction opposée. Cette approche est optimale pour toutes les dimensions de M code> et n code>.
ig donc mais je ne pouvais pas le comprendre complètement à cause de la mise en forme et de certaines explications coupées
A ajouté quelques exemples, espérons que cela aide.
Comme vous n'avez pas besoin d'un code, laissez-moi vous expliquer comment vous pourriez le faire avec des modèles. P>
Dites que vous avez un tableau D-dimensional de taille n_ {0}, ..., n_ {d-1} Vous pouvez toujours supprimer une dimension en fusionnant deux d'entre eux multiplier les tailles. Exemples: A [5] [4] [3] contient 60 éléments, Ainsi, B [20] [3] ou C [5] [12] (pour des cas simples, car vous pouvez même construire D [15] [4] et Toute permutations) peut facilement contenir les mêmes éléments que A, la cartographie des indices est également si évidente ... p>
Utilisez maintenant C ++ le faire beaucoup plus difficile, mais vous aurez besoin de modèles de variadic et de métaprogrammation de modèle. P>
Modèle variadique Pour définir un type de matrice de toute dimension que vous aimez et Modèle de métaprogrammation pour définir un opérateur pour mapper un réseau D-dimension sur un N-dimensionnel. (Je peux dire que ce ne sera pas facile, mais un très bon exercice de métaprogrammation de modèle). P>
Et si m a k facteurs et n> k?
M [a] [b] peut être trivialement projeté dans m [1] [1] [1] [A] [B], n'est-ce pas?
Oui @ Jean-Baptisteyunès. Je cherchais une façon optimale de faire ça. Vous avez montré une solution triviale mais je me demande si c'est aussi l'optimal?
Qu'entendez-vous par optimal? À la fin, tout est plat dans la machine, il suffit donc de jouer avec des coordonnées pour indexer une structure linéaire.
Oh @ Jean-Baptisteyunès Je n'en pensais pas. Je laisserai un uppote à votre réponse pour ce commentaire.
Vous voulez simplement reformater vos matrices pendant que aucune donnée n'est modifiée. Comme je m'inspire dans mon commentaire, le plus simple consiste à utiliser 1D matrice moyenne étape pour convertir de m à n dimensions.
Les autres réponses ici sont sur la même piste, mais manquent de tout le calcul ... ils ont juste des exemples jusqu'à une petite dimension sans équation universelle, donc ici est le suivant: p>
à convertir entre où A0, A1, ... A (m-1) code> et Vous n'avez réellement pas besoin de convertir le MD matry dans 1D, puis revenez à ND SOIT suffisamment pour convertir les index afin: p> N'oubliez pas que les tailles doivent être: p> A [A0] [A1] ... [A (M-1)] Code> et X [A0 * A1 * ... * A (M-1)] Code> Où A0, A1, ... A (M-1) CODE> Les tailles de dimension de votre conteneur (résolution) font simplement ceci: p> x code> sont les index dans les tableaux. P> A0*A1*...*A(M-1) <= B0*B1*...*B(N-1)
Wow, je n'ai pas vu la dynamique imbriquée pour boucle. Ça a l'air intéressant!
Je pense que cela serait similaire à convertir une représentation numérique d'une base à une autre. Seule la différence que la base peut être différente pour chaque dimension. Par exemple, vous pouvez traiter le nombre décimal 1234 sous forme d'index dans la matrice 4 dimensions où chaque dimension a la taille 10.
N'importe quel code à afficher?
Montrez ce que vous avez essayé jusqu'à présent.
@ Jarod42 Il est au coucher et la question est soudainement tombée dans mon esprit. Je peux le tenter demain et vous montrer du code comme réponse à cette question si je pouvais le faire.
Pour un but pratique, juste une enveloppe modélisée à linéaire
std :: vecteur code> qui fournit un accès X dimensionnel devrait suffire, seule question serait de quoi faire lorsque le vecteur sous-tendance doit être une taille différente.Êtes-vous en train d'écrire sur la sérialisation / la désérialisation où la taille des données reste la même ou si vous souhaitez une sorte de dimensionnalité géométrique de projection / cartographie (des sommets ou des voxels)? Pour le premier, vous avez simplement encodé M-Dim dans une matrice 1D et convertir à N-Dim. Pour ce dernier, voir Techniques de rendu 4D
@Spektre Je ne fais rien de sérieux avec ça. La question m'a rencontré après avoir eu une petite discussion sur les tableaux N-dimensionnels dans une section de commentaire de ce site.
@ArdentCoder j'ai ajouté une réponse avec la conversion en C ++ ...