2

J'essaye d'implémenter le Brooks-Iyengar algorithm pour la fusion de sonde, et essaye de représenter la structure de données suivante dans MATLAB.Comment représenter et accéder aux éléments de cette structure de données à valeurs multiples?

A = {([1.5,3.2],4), ([0,2.7],5), ([0.8,2.8],4)} 

J'ai essayé de faire ce qui suit

B = {{[1.5,3.2],4},{[0,2.7],5}} 

Mais je ne sais pas comment accéder à chaque élément, à savoir 1.5, 3.2 et la 4 ainsi que la prochaine série de valeurs. Je reçois un ensemble d'éléments de B{1}, mais je ne suis pas en mesure d'obtenir les valeurs individuelles après. Des idées ou des liens vers des liens appropriés seraient utiles.

Répondre

4

Avec la structure actuelle, vous pouvez simplement continuer l'indexation:

>> B{1} 

ans = 

    [1x2 double] [4] 

>> B{1}{1} 

ans = 

    1.5000 3.2000 

>> B{1}{1}(2) 

ans = 

    3.2000 

>> B{1}{2} 

ans = 

    4 

Pour supprimer un élément de la structure principale, vous pouvez utiliser la syntaxe suivante B(1) = [];:

>> B = {{[1.5,3.2],4},{[0,2.7],5}} 

B = 

    {1x2 cell} {1x2 cell} 

>> B(1) = [] 

B = 

    {1x2 cell} 

>> B{1} 

ans = 

    [1x2 double] [5] 

>> 

Vous pourrait également choisir de représenter les données dans un structure array (avec une meilleure dénomination de propriété):

>> s = struct('prop1',{4, 5},'prop2', {[1.5,3.2], [0,2.7]}) 

s = 

1x2 struct array with fields: 

    prop1 
    prop2 

>> s(1).prop1 

ans = 

    4 

>> s(1).prop2 

ans = 

    1.5000 3.2000 

>> s(1).prop2(2) 

ans = 

    3.2000 

Pour supprimer un élément, vous pouvez utiliser la syntaxe similaire:

s(1) = [] 

Si vous voulez effectue certaines opérations sur les éléments de données, vous pouvez également choisir d'aller avec l'approche de la POO, et créez une classe qui représente un seul élément de données et éventuellement un qui représente l'ensemble de données entier. L'accès aux membres de données est naturel.

+0

Cela a l'air génial.Juste une question de suivi, comment pourrais-je supprimer une entrée de données (disons, '{[1.5.3.2], 4}') de la première structure? – bhatGautam

+1

Mise à jour de la réponse sur la façon de supprimer des éléments en utilisant l'approche originale ou la structure de la matrice. – DVarga

+0

Mais quand je fais B {1} = [], la taille de la cellule ne diminue pas. Il a une entrée vide. Un moyen de supprimer cet ensemble vide? – bhatGautam

1

Si vous êtes complètement mis sur l'utilisation de cellules alors je commencerais par cell2mat et voir si cela aide.

vals = cell2mat(B{2}) % returns the array vals=[0 2.7 5] 

Vous pouvez également utiliser simplement vos données comme matrice normale dès le début:

B = [ 1.5, 3.2, 4; 0, 2.7, 5]; 

Et puis utilisez la colonne 3 comme vos clés si cela était votre intention (et ils sont numériques). Si les clés ne sont pas garanties numériques, une struct pourrait être utile.

edit: DVarga donne une réponse plus détaillée et utile, je pense.

2

Si votre version Matlab est assez nouveau (ie> = R2013b) vous pouvez utiliser un table pour cela:

A = table([1.5,3.2; 0,2.7; 0.8,2.8],[4; 5; 4],'VariableNames',{'name1','name2'}); 

enter image description here

Comme vous pouvez le voir, le résultat est facile à inspecter (visuellement) et facile d'accès:

A.name1(3,2) % is 2.8000