2017-06-24 2 views
-5

Le problème est que j'ai une boucle comme suit:parcelles multiples coombine et concaténer dans Matlab

for i=1:(rx * tx)  
    for j=1:(rx * tx) 
     eval(sprintf('t_%d_%d_t = corrcoef(m_a%d_abs, m_b%d_abs)', pairs(i), pairs(j), pairs(i), pairs(j))); 
     eval(sprintf('t_%d_%d = t_%d_%d_t(1, 2)', pairs(i), pairs(j), pairs(i), pairs(j))); 

     if(eval(sprintf('t_%d_%d', pairs(i), pairs(j))) >= max_cor) 
      eval(sprintf('figure(''name'', ''a (%d) <> b (%d)'')', pairs(i), pairs(j))); 
      eval(sprintf('plot(a%d, ''r'')', pairs(i))); 
      hold on; 
      eval(sprintf('plot(b%d, ''b'')', pairs(j))); 
      xlabel('Tones (f)'); 
     end 
    end 
end 

ce pour des parcelles boucle chaque parcelle dans une nouvelle fenêtre selon l'instruction if comme ce complot enter image description here

Je souhaite concaténer chaque parcelle suivante après la dernière parcelle de sorte que toutes les parcelles soient combinées sur une parcelle mais concaténées. J'espère que vous me comprenez. Merci beaucoup.

+0

Vous voulez toutes les lignes dans une intrigue? Ou vous voulez plusieurs parcelles côte à côte dans le même chiffre? – DMR

+0

plusieurs parcelles dans la même figure, chaque parcelle suivante étant concaténée avec la dernière parcelle. Sur la figure ci-dessus, l'intrigue se termine sur 56 et l'intrigue suivante devrait commencer après 56. Comprenez-vous ce que je veux dire? –

+0

Je le crois, je viens de poster une solution possible basée sur ma compréhension de ce que vous essayez de faire. – DMR

Répondre

0

Déplacer la commande figure hors de la boucle, l'ouverture d'un seul chiffre pour toutes les parcelles:

figure; 

for i=1:(rx * tx)  
    for j=1:(rx * tx) 
     eval(sprintf('t_%d_%d_t = corrcoef(m_a%d_abs, m_b%d_abs)', pairs(i), pairs(j), pairs(i), pairs(j))); 
     eval(sprintf('t_%d_%d = t_%d_%d_t(1, 2)', pairs(i), pairs(j), pairs(i), pairs(j))); 

     if(eval(sprintf('t_%d_%d', pairs(i), pairs(j))) >= max_cor) 
      eval(sprintf('(''name'', ''a (%d) <> b (%d)'')', pairs(i), pairs(j))); 
      eval(sprintf('plot(a%d, ''r'')', pairs(i))); 
      hold on; 
      eval(sprintf('plot(b%d, ''b'')', pairs(j))); 
      xlabel('Tones (f)'); 
     end 
    end 
end 
+0

Ok, mais cette solution trace toutes les données sur la même plage (1-56) et ne concatène pas. Par exemple, la boucle for représente 5 chiffres. Je veux que toutes les parcelles d'allumages soient sur le même chiffre mais concaténées. –

+0

Il est difficile de dire sans avoir accès aux valeurs que vous tracez, mais je pense que le problème est que vous ne spécifiez pas de valeurs x, dans votre commande plot, alors MATLAB utilise simplement l'index de chaque valeur comme x coordonnée. Pour ne pas utiliser les index, vous devez spécifier les valeurs x et y dans votre commande plot, par exemple, plot (57: 112, data), etc. En outre, le code peut être réécrit pour être plus lisible en supprimant l'utilisation des instructions sprintf et eval pour construire les variables. – DMR

+3

@MarkDelphi Peut-être qu'il vaudrait mieux définir exactement ce que vous entendez par concaténation plutôt que CRIER chez les personnes qui essaient de vous aider. Il aurait également été préférable d'ajouter cette précision à votre question précédente plutôt que d'en ouvrir une nouvelle. – beaker

1

Votre code doit être enseigné comme un exemple pour Comment vous ne devriez jamais écrire du code dans Matlab!, votre utilisation massive de eval, il est pratiquement impossible de suivre votre code. Par conséquent, je vais laisser tomber ici ce que je pense peut résoudre votre problème, mais pour toutes les explications, vous devez d'abord réécrire votre code d'une manière appropriée (vous pouvez lire this et this).

c = 0; 
for k=1:(rx * tx)  
    for m=1:(rx * tx) 
     eval(sprintf('t_%d_%d_t = corrcoef(m_a%d_abs, m_b%d_abs)', pairs(k), pairs(m), pairs(k), pairs(m))); 
     eval(sprintf('t_%d_%d = t_%d_%d_t(1, 2)', pairs(k), pairs(m), pairs(k), pairs(m))); 
     if(eval(sprintf('t_%d_%d', pairs(k), pairs(m))) >= max_cor) 
      nx = eval(sprintf('numel(a%d)', pairs(k))); 
      X = c+1:(c+nx); 
      eval(sprintf('plot(X,a%d, ''r'')', pairs(k))); 
      hold on; 
      eval(sprintf('plot(X,b%d, ''b'')', pairs(m))); 
      c = c+nx; 
      xlabel('Tones (f)'); 
     end 
    end 
end 
+0

Dans un auto-plug éhonté, je suggère également de regarder [cette réponse] (https://stackoverflow.com/questions/40226214/matlab-loop-through-the-values-of-a-list-from-who -function/40226542 # 40226542) pour voir comment on peut s'échapper sans douleur du nom de variable dynamique pit de 'eval' doom en utilisant' save'/'load'. –