Comment puis-je convertir des valeurs double en nombres entiers pour les indices de créer une matrice creuse dans MATLAB?
Je suis à l'aide de MATLAB pour charger un fichier texte que je veux faire une matrice creuse de. Les colonnes dans le fichier texte, reportez-vous à la ligne d'indices et sont double
type. J'ai besoin d'eux pour être des entiers pour être en mesure de les utiliser comme des indices de lignes et de colonnes. J'ai essayé d'utiliser uint8
, int32
et int64
pour les convertir en nombres entiers de les utiliser pour construire une matrice creuse de la manière suivante:
??? Undefined fonction ou méthode "maigres" pour l'entrée
les arguments du type "int64'.
Erreur ==> make_network à 5graphique =sparse(int64(listedges(:,1)),int64(listedges(:,2)),ones(size(listedges,1),1));
Comment puis-je convertir le texte des entrées du fichier chargé, du double, de manière à être utilisé par le sparse
fonction?
Vous devez vous connecter pour publier un commentaire.
Il n'est pas nécessaire pour la conversion, garder les indices
double
:??? Error using ==> sparse Index into matrix must be an integer. Error in ==> make_network at 6 graph = sparse(listedges(:, 1), listedges(:, 2), ones(size(listedges, 1), 1));
??? Error using ==> sparse Index into matrix must be an integer. Error in ==> make_network at 8 graph = sparse(r(:, 1), r(:, 2), ones(size(listedges, 1), 1));
Il y a deux raisons pour lesquelles on peut vouloir se convertir à
int
:La première, parce que vous avez données type de restrictions.
La seconde, vos données peuvent contenir des fractions et de l'onu,-apte à être utilisé en tant que nombres entiers.
Si vous voulez convertir à cause de la première raison - alors il n'y a pas besoin d': Matlab fonctionne avec
double
type par défaut et traite souventdoubles
comme ints (par exemple, lorsqu'il est utilisé comme indices).Cependant, si vous souhaitez convertir des entiers parce que la deuxième raison (numéros peuvent être fractionals), alors vous devriez utiliser
round()
,ceil()
oufloor()
- ce qui convient à votre but de mieux.class(round(col1(:)))ans =double
sparse( round( listedges(:,1) ), round( listedges(:,2) ), 1 );
avecdouble
s??? Error using ==> sparse Index into matrix must be an integer. Error in ==> make_network at 9 graph=sparse( round( listedges(:,1) ), round( listedges(:,2)), 1 );
listedges
a des éléments plus petits que 1? les éléments que quandround
ed sont nul ou négatif?K>>min(listedges(:,1))ans=1 K>> min(listedges(:,2)) ans=1
, Je me doutais bien que trop, mais non il n'y a rien de plus bas que 1.Il y a une autre très bonne raison ( et vraiment d'une primaire..) pourquoi on peut vouloir convertir les indices de structure (matrice, la matrice, etc.) int.
Si jamais vous programme dans une autre langue que Matlab, vous serait familier avec veulent gagner de l'espace mémoire, en particulier avec de grandes structures. Être en mesure de traiter les éléments dans de telles structures avec des indices autres que le double est la clé.
Un problème majeur avec Matlab est l'incapacité à plus finement le contrôle de la taille des structures multidimensionnelles de cette façon. Il y a sparse matrix solutions, mais ceux ne sont pas suffisantes pour de nombreux cas. Matrices de cellules de préserver les types de données sur access, cependant le stockage pour chaque élément de la matrice de cellules est extrêmement gourmande en termes de stockage (113 octets pour un seul uint8 encapsulé dans une cellule).