2017-10-19 7 views
0

Envisager table dans Matlab.Comment concaténer/assigner une chaîne de longueur différente à une table Matlab existante?

a = table(); 
a.c = 'a'; 

Comment puis-je ajouter une ligne contenant une chaîne de longueur différente à cette table? à-dire je veux obtenir:

c 
______ 

'a'  
'aa' 

Par exemple, cette simple tentative donne une erreur:

b = table(); 
b.c = 'aa'; 
result = [a; b] 

Erreur:

Could not concatenate the table variable 'c' using VERTCAT. Caused by: Error using vertcat Dimensions of matrices being concatenated are not consistent.

+0

Les tableaux simples ne gèrent pas les chaînes de différentes longueurs. Essayez d'utiliser des tableaux de cellules. – Nivi

+1

'a = table(); a.c = {'a'; 'aa'} 'le ferait, ou' a = table(); a.c = {'a'}; a.c (fin + 1,1) = {'aa'}; 'ajouter à la fin – Wolfie

+0

@Wolfie Merci beaucoup! Ça marche ! S'il vous plaît convertir un commentaire pour répondre - Je vais l'accepter. (Je connais la première façon - ac = {'a'; 'aa'} - mais dans mon cas je ne peux pas l'utiliser car il est en boucle et ne sait pas {'a'; 'aa'} à l'avance, mais le OKAY!) –

Répondre

1

Si vous avez une colonne entière de données, vous pouvez créer une colonne à partir d'une matrice de cellules

tbl = table(); 
tbl.mycol = {'some text'; 
      'something else'; 
      'third item'}; 

Si vous souhaitez ajouter un des éléments simples (comme dans une boucle), vous pouvez faire

tbl = table(); 
mycell = {'some text'; 
      'something else'; 
      'third item'}; 
tbl.mycol = {}; 
for ii = 1:numel(mycell) 
    tbl.mycol(ii) = mycell(ii); 
end 

de même, vous pouvez ajouter à la fin comme vous le feriez un tableau

tbl.mycol(end+1) = {'fourth item'}; 

Vous pouvez fusionner deux tables en les enchaînant à l'aide vertcat

myothercell = {'append this'; 
       '...and this'}; 
tbl1 = table(); 
tbl1.mycol = mycell; 
tbl2 = table(); 
tbl2.mycol = myothercell; 

tbl3 = vertcat(tbl1, tbl2); 
1

En raison de la façon dont les objets table de Matlab traite les contenus données, il essaie d'être intelligent avec les types de données. Occasionnellement, lorsque les choses essaient d'être intelligentes dans les coulisses, elles se déclenchent d'une manière qui n'est pas nécessairement évidente pour l'utilisateur.

Qu'est-ce qui se passe ici est que, puisque votre colonne c est créée avec un tableau de caractères, MATLAB tente de garder cette colonne homogène et de concaténer 'a' avec 'aa'. Cela entraînera une erreur en raison de la manipulation par MATLAB de character arrays comme matrices de caractères, qui est livré avec une mise en application de taille: toutes les lignes doivent avoir le même nombre de colonnes.

Vous avez quelques options: utilisez un string array (introduit dans R2016b) ou utilisez un cell array. Alors que les tableaux de chaînes sont essentiellement des tableaux de cellules sous le capot, ils ont l'avantage de méthodes de chaînes dédiées, vous permettant d'effectuer nativement diverses opérations de chaînes sans avoir besoin d'indexer explicitement dans un tableau de cellules.

Pour changer votre code, il suffit d'utiliser des guillemets doubles ("") au lieu de guillemets simples (''):

a = table(); 
a.c = "a"; 
b = table(); 
b.c = "aa"; 

T = [a;b] 

qui retourne:

T = 

    2×1 table 

    c 
    ____ 

    "a" 
    "aa" 

Vous pouvez forcer explicitement le type de c en tant que matrice de cellules:

a = table(); 
a.c = {'a'}; 
b = table(); 
b.c = 'aa'; 

T = [a; b] 

Qui rend la même chose.