MATLAB Language
Functies zonder papieren
Zoeken…
Opmerkingen
- Het gebruik van ongedocumenteerde functies wordt als een risicovolle praktijk beschouwd 1 , omdat deze functies zonder kennisgeving kunnen worden gewijzigd of gewoon anders werken op verschillende MATLAB-versies. Om deze reden wordt geadviseerd om defensieve programmeertechnieken te gebruiken, zoals het omsluiten van stukjes code zonder papieren in
try/catch
blokken met gedocumenteerde fallbacks.
C ++ compatibele helperfuncties
Het gebruik van Matlab Coder ontkent soms het gebruik van enkele veel voorkomende functies, als deze niet compatibel zijn met C ++. Relatief vaak bestaan er ongedocumenteerde helperfuncties , die kunnen worden gebruikt als vervanging.
Hier is een uitgebreide lijst met ondersteunde functies. .
En een aantal alternatieven volgen voor niet-ondersteunde functies:
De functies sprintf
en sprintfc
lijken veel op elkaar, de voormalige returns een karakter array, waarbij de laatste een cel string:
str = sprintf('%i',x) % returns '5' for x = 5
str = sprintfc('%i',x) % returns {'5'} for x = 5
sprintfc
is echter compatibel met C ++ ondersteund door Matlab Coder, en sprintf
is dat niet.
Kleurgecodeerde 2D-lijnplots met kleurgegevens in de derde dimensie
In MATLAB-versies voorafgaand aan R2014b , waarbij de oude grafische HG1-engine werd gebruikt, was het niet duidelijk hoe 2D-gecodeerde 2D- lijnplots konden worden gemaakt. Met de release van de nieuwe grafische HG2-engine ontstond een nieuwe ongedocumenteerde functie geïntroduceerd door 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)
Semi-transparante markeringen in lijn- en spreidingsplots
Sinds Matlab R2014b is het eenvoudig mogelijk om semi-transparante markeringen te verkrijgen voor lijn- en spreidingsplots met behulp van ongedocumenteerde functies geïntroduceerd door Yair Altman .
Het basisidee is om de verborgen greep van de markeringen te krijgen en een waarde <1 toe te passen voor de laatste waarde in de EdgeColorData
om de gewenste transparantie te bereiken.
Hier gaan we voor 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] );
en voor een plot
%// 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] );
De markeringshandgrepen, die worden gebruikt voor de manipulatie, worden met de figuur gemaakt. De opdracht drawnow
zorgt ervoor dat de figuur wordt gemaakt voordat de volgende opdrachten worden aangeroepen en voorkomt fouten in het geval van vertragingen.
Contourplots - Pas de tekstlabels aan
Bij het weergeven van labels op contouren laat Matlab u niet toe het formaat van de getallen te regelen, bijvoorbeeld om te veranderen in wetenschappelijke notatie.
De afzonderlijke tekstobjecten zijn normale tekstobjecten, maar hoe u ze krijgt is niet gedocumenteerd. U TextPrims
ze vanuit de eigenschap TextPrims
van de contourhandgreep.
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
Opmerking : dat u een drawnow
opdracht moet toevoegen om Matlab te dwingen de contouren te tekenen, het aantal en de locatie van de txt-objecten worden alleen bepaald wanneer de contouren daadwerkelijk worden getekend, zodat de tekstobjecten alleen dan worden gemaakt.
Het feit dat de txt-objecten worden gemaakt wanneer de contouren worden getekend, betekent dat ze opnieuw worden berekend telkens wanneer de plot opnieuw wordt getekend (bijvoorbeeld het formaat van de figuur wijzigen). Om dit te beheren moet je luisteren naar het 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
Voorbeeld getest met Matlab r2015b op Windows
Items toevoegen / toevoegen aan een bestaande legende
Bestaande legendes kunnen moeilijk te beheren zijn. Als uw plot bijvoorbeeld twee regels heeft, maar er slechts één een legenda-invoer heeft en dat moet zo blijven, dan kan het toevoegen van een derde regel met een legenda-invoer moeilijk zijn. Voorbeeld:
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
Om nu een legenda-item toe te voegen voor tan
, maar niet voor cos
, is een van de volgende regels niet voldoende; ze falen allemaal op de een of andere manier:
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)
Gelukkig houdt een ongedocumenteerde legende-eigenschap genaamd PlotChildren
de kinderen van de ouderfiguur 1 bij . Dus, de manier om te gaan is om de kinderen van de legende expliciet als volgt in te stellen via de eigenschap PlotChildren
:
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
De legenda wordt automatisch bijgewerkt als een object wordt toegevoegd aan of verwijderd uit de eigenschap PlotChildren
.
1 Inderdaad: figuur. U kunt het onderliggende DisplayName
een figuur met de eigenschap DisplayName
aan elke legenda in de figuur, bijvoorbeeld uit een ander subplot. Dit komt omdat een legende op zichzelf in wezen een assenobject is.
Getest op MATLAB R2016b
Scatter plot jitter
De scatter
heeft twee ongedocumenteerde eigenschappen 'jitter'
en 'jitterAmount'
waarmee de gegevens alleen op de x-as kunnen worden 'jitterAmount'
. Dit dateert uit Matlab 7.1 (2005) en mogelijk eerder.
Om deze functie in te schakelen, stelt u de eigenschap 'jitter'
in op 'on'
en stelt u de eigenschap 'jitterAmount'
in op de gewenste absolute waarde (de standaardwaarde is 0.2
).
Dit is erg handig wanneer we overlappende gegevens willen visualiseren, bijvoorbeeld:
scatter(ones(1,10), ones(1,10), 'jitter', 'on', 'jitterAmount', 0.5);
Lees meer over Matlab zonder papieren