MATLAB Language
Fonctionnalités non documentées
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
blocstry/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)
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] );
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] );
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
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);
En savoir plus sur Undocumented Matlab