Recherche…


Remarques

  • L'utilisation de fonctionnalités non documentées est considérée comme une pratique risquée 1 , car ces fonctionnalités peuvent changer sans préavis ou simplement fonctionner différemment sur différentes versions de MATLAB. Pour cette raison, il est conseillé d'utiliser des techniques de programmation défensives telles que la mise en place de blocs de code non documentés dans try/catch blocs try/catch avec des solutions de secours documentées.

Fonctions d'aide compatibles C ++

L'utilisation de Matlab Coder refuse parfois l'utilisation de certaines fonctions très courantes, si elles ne sont pas compatibles avec C ++. Il existe relativement souvent des fonctions auxiliaires non documentées , qui peuvent être utilisées comme substituts.

Voici une liste complète des fonctions prises en charge. .

Et en suivant une série d'alternatives, pour les fonctions non prises en charge:


Les fonctions sprintf et sprintfc sont assez similaires, les anciens renvoie un tableau de caractères, ce dernier une chaîne cellulaire:

 str = sprintf('%i',x)   % returns '5' for x = 5
 str = sprintfc('%i',x)  % returns {'5'} for x = 5

Cependant, sprintfc est compatible avec C ++ pris en charge par Matlab Coder, mais pas sprintf .

Tracés de lignes 2D à code couleur avec données de couleur en troisième dimension

Dans les versions de MATLAB antérieures à R2014b , utilisant l'ancien moteur graphique HG1, il n'était pas évident de créer des tracés de lignes 2D avec code couleur . Avec la sortie du nouveau moteur graphique HG2, une nouvelle fonctionnalité non documentée a été introduite par Yair Altman :

n = 100;
x = linspace(-10,10,n); y = x.^2;
p = plot(x,y,'r', 'LineWidth',5);

% modified jet-colormap
cd = [uint8(jet(n)*255) uint8(ones(n,1))].';

drawnow
set(p.Edge, 'ColorBinding','interpolated', 'ColorData',cd)

graphique linéaire

Marqueurs semi-transparents dans les lignes et les nuages ​​de points

Depuis Matlab R2014b, il est facilement possible d'obtenir des marqueurs semi-transparents pour les tracés de lignes et de dispersion en utilisant les fonctionnalités non documentées introduites par Yair Altman .

L'idée de base est d'obtenir le handle caché des marqueurs et d'appliquer une valeur <1 pour la dernière valeur dans EdgeColorData pour obtenir la transparence souhaitée.

Ici nous allons pour la scatter :

%// example data
x = linspace(0,3*pi,200);
y = cos(x) + rand(1,200);

%// plot scatter, get handle
h = scatter(x,y); 
drawnow; %// important

%// get marker handle
hMarkers = h.MarkerHandle; 

%// get current edge and face color
edgeColor = hMarkers.EdgeColorData
faceColor = hMarkers.FaceColorData

%// set face color to the same as edge color
faceColor = edgeColor;

%// opacity
opa = 0.3;

%// set marker edge and face color
hMarkers.EdgeColorData = uint8( [edgeColor(1:3); 255*opa] ); 
hMarkers.FaceColorData = uint8( [faceColor(1:3); 255*opa] ); 

entrer la description de l'image ici

et pour un plot ligne

%// example data
x = linspace(0,3*pi,200);
y1 = cos(x);
y2 = sin(x);

%// plot scatter, get handle
h1 = plot(x,y1,'o-','MarkerSize',15); hold on
h2 = plot(x,y2,'o-','MarkerSize',15); 
drawnow; %// important

%// get marker handle
h1Markers = h1.MarkerHandle; 
h2Markers = h2.MarkerHandle; 

%// get current edge and face color
edgeColor1 = h1Markers.EdgeColorData;
edgeColor2 = h2Markers.EdgeColorData;

%// set face color to the same as edge color
faceColor1 = edgeColor1;
faceColor2 = edgeColor2;

%// opacity
opa = 0.3;

%// set marker edge and face color
h1Markers.EdgeColorData = uint8( [edgeColor1(1:3); 255*opa] ); 
h1Markers.FaceColorData = uint8( [faceColor1(1:3); 255*opa] ); 
h2Markers.EdgeColorData = uint8( [edgeColor2(1:3); 255*opa] ); 
h2Markers.FaceColorData = uint8( [faceColor2(1:3); 255*opa] ); 

entrer la description de l'image ici

Les poignées de marqueur utilisées pour la manipulation sont créées avec la figure. La commande drawnow assure la création de la figure avant l'appel des commandes suivantes et évite les erreurs en cas de retard.

Tracés de contour - Personnaliser les étiquettes de texte

Lorsque vous affichez des étiquettes sur les contours, Matlab ne vous permet pas de contrôler le format des nombres, par exemple pour passer à la notation scientifique.

Les objets texte individuels sont des objets texte normaux, mais la manière dont vous les obtenez n'est pas documentée. Vous y accédez à partir de la propriété TextPrims du TextPrims de contour.

  figure
  [X,Y]=meshgrid(0:100,0:100);
  Z=(X+Y.^2)*1e10;
  [C,h]=contour(X,Y,Z);
  h.ShowText='on';
  drawnow();
  txt = get(h,'TextPrims');
  v = str2double(get(txt,'String'));
  for ii=1:length(v)
    set(txt(ii),'String',sprintf('%0.3e',v(ii)))
  end

Remarque : vous devez ajouter une commande drawnow pour forcer Matlab à dessiner les contours. Le nombre et l'emplacement des objets txt ne sont déterminés que lorsque les contours sont réellement dessinés, afin que les objets texte ne soient créés qu'à ce moment-là.

Le fait que les objets txt soient créés lorsque les contours sont dessinés signifie qu'ils sont recalculés chaque fois que le tracé est redessiné (par exemple, redimensionnement de la figure). Pour gérer cela, vous devez écouter l' undocumented event MarkedClean :

function customiseContour
  figure
  [X,Y]=meshgrid(0:100,0:100);
  Z=(X+Y.^2)*1e10;
  [C,h]=contour(X,Y,Z);
  h.ShowText='on';
  % add a listener and call your new format function
  addlistener(h,'MarkedClean',@(a,b)ReFormatText(a))
end
function ReFormatText(h)
  % get all the text items from the contour
  t = get(h,'TextPrims');
  for ii=1:length(t)
    % get the current value (Matlab changes this back when it 
    %   redraws the plot)
    v = str2double(get(t(ii),'String'));
    % Update with the format you want - scientific for example
    set(t(ii),'String',sprintf('%0.3e',v));
  end
end

entrer la description de l'image ici

Exemple testé avec Matlab r2015b sous Windows

Ajout / ajout d'entrées à une légende existante

Les légendes existantes peuvent être difficiles à gérer. Par exemple, si votre tracé comporte deux lignes, mais qu'une seule d'entre elles comporte une entrée de légende et que cela doit rester ainsi, l'ajout d'une troisième ligne avec une entrée de légende peut s'avérer difficile. Exemple:

figure
hold on
fplot(@sin)
fplot(@cos)
legend sin  % Add only a legend entry for sin
hTan = fplot(@tan);  % Make sure to get the handle, hTan, to the graphics object you want to add to the legend

Maintenant, pour ajouter une entrée de légende pour tan , mais pas pour cos , aucune des lignes suivantes ne fera l'affaire. ils échouent tous d'une manière ou d'une autre:

legend tangent  % Replaces current legend -> fail
legend -DynamicLegend  % Undocumented feature, adds 'cos', which shouldn't be added -> fail
legend sine tangent  % Sets cos DisplayName to 'tangent' -> fail
legend sine '' tangent  % Sets cos DisplayName, albeit empty -> fail
legend(f)

Heureusement, une propriété de légende non documentée appelée PlotChildren garde la trace des enfants de la figure parent 1 . Ainsi, la voie à suivre est de définir explicitement les enfants de la légende à travers sa propriété PlotChildren comme suit:

hTan.DisplayName = 'tangent';  % Set the graphics object's display name
l = legend;
l.PlotChildren(end + 1) = hTan;  % Append the graphics handle to legend's plot children

La légende est mise à jour automatiquement si un objet est ajouté ou supprimé de sa propriété PlotChildren .

1 En effet: figure. Vous pouvez ajouter un enfant de n'importe quel personnage avec la propriété DisplayName à une légende de la figure, par exemple à partir d'une sous-intrigue différente. En effet, une légende en elle-même est essentiellement un objet de type axe.

Testé sur MATLAB R2016b

Scatter plot jitter

La fonction scatter a deux propriétés non documentées 'jitter' et 'jitterAmount' qui permettent de faire pivoter les données sur l'axe des x uniquement. Cela remonte à Matlab 7.1 (2005), et peut-être plus tôt.

Pour activer cette fonctionnalité, définissez la propriété 'jitter' sur 'on' et définissez la propriété 'jitterAmount' sur la valeur absolue souhaitée (la valeur par défaut est 0.2 ).

Ceci est très utile lorsque vous souhaitez visualiser des données qui se chevauchent, par exemple:

scatter(ones(1,10), ones(1,10), 'jitter', 'on', 'jitterAmount', 0.5);

données de chevauchement de la gigue

En savoir plus sur Undocumented Matlab



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow