MATLAB Language
Obokumenterade funktioner
Sök…
Anmärkningar
- Att använda odokumenterade funktioner anses vara en riskabel praxis 1 , eftersom dessa funktioner kan ändras utan föregående meddelande eller helt enkelt fungera annorlunda på olika MATLAB-versioner. Av detta skäl rekommenderas det att använda defensiva programmeringstekniker som att tillsluta odokumenterade kodstycken i
try/catch
block med dokumenterade fallbacks.
C ++ kompatibla hjälpfunktioner
Användningen av Matlab Coder förnekar ibland användningen av några mycket vanliga funktioner om de inte är kompatibla med C ++. Relativt ofta finns odokumenterade hjälpfunktioner som kan användas som ersättare.
Här är en omfattande lista över funktioner som stöds. .
Och efter en samling alternativ, för funktioner som inte stöds:
Funktionerna sprintf
och sprintfc
är ganska lika, den förstnämnda returnerar en teckenuppsättning , den senare en cellsträng :
str = sprintf('%i',x) % returns '5' for x = 5
str = sprintfc('%i',x) % returns {'5'} for x = 5
sprintfc
är dock kompatibel med C ++ som stöds av Matlab Coder, och sprintf
är det inte.
Färgkodade 2D-linjeplott med färgdata i tredje dimension
I MATLAB-versioner före R2014b , med hjälp av den gamla HG1-grafikmotorn, var det inte uppenbart hur man skapar färgkodade 2D-linjeplaner . Med lanseringen av den nya HG2-grafikmotorn uppstod en ny odokumenterad funktion introducerad av 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)
Halvtransparenta markörer i linje och spridningsdiagram
Sedan Matlab R2014b är det lätt möjligt att uppnå halvtransparenta markörer för linje- och spridningsdiagram med odokumenterade funktioner introducerade av Yair Altman .
Den grundläggande idén är att få markörernas dolda handtag och tillämpa ett värde <1 för det sista värdet i EdgeColorData
att uppnå önskad transparens.
Här går vi för 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] );
och för en 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] );
Markörhandtagen, som används för manipulationen, skapas med figuren. drawnow
kommandot säkerställer skapandet av figuren innan efterföljande kommandon kallas och undviker fel vid förseningar.
Konturplott - anpassa textetiketter
När du visar etiketter på konturer tillåter Matlab inte att du kontrollerar formatet på siffrorna, till exempel för att byta till vetenskaplig notation.
De enskilda textobjekten är vanliga textobjekt, men hur du får dem är inte dokumenterat. Du kommer åt dem från egenskapen TextPrims
i TextPrims
.
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
Obs : att du måste lägga till ett drawnow
kommando för att tvinga Matlab att rita konturerna, antalet och platsen för txt-objekt bestäms endast när konturerna faktiskt dras så textobjekten skapas först då.
Det faktum att txt-objekten skapas när konturerna dras innebär att de beräknas om varje gång plotten ritas om (till exempel storleksformat). För att hantera detta måste du lyssna på den 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
Exempel testat med Matlab r2015b på Windows
Lägga till / lägga till poster till en befintlig legend
Befintliga legender kan vara svåra att hantera. Till exempel, om din tomt har två rader, men bara en av dem har en legend-post och som borde vara så här, kan det vara svårt att lägga till en tredje rad med en legend-post. Exempel:
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
För att lägga till en legend-post för tan
, men inte för cos
, kommer någon av följande rader inte att göra susen; de misslyckas alla på något sätt:
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)
Lyckligtvis håller en odokumenterad PlotChildren
heter PlotChildren
koll på barnen till föräldersfigur 1 . Så vägen att gå är att uttryckligen ställa legendens barn genom sin egendom PlotChildren
enligt följande:
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
Legenden uppdateras automatiskt om ett objekt läggs till eller tas bort från egenskapen PlotChildren
.
1 Faktiskt: figur. Du kan lägga till alla DisplayName
barn med egenskapen DisplayName
till vilken legend som helst i figuren, t.ex. från en annan delplan. Detta beror på att en legende i sig i princip är ett axelobjekt.
Testat på MATLAB R2016b
Scatter plot jitter
scatter
har två odokumenterade egenskaper 'jitter'
och 'jitterAmount'
som tillåter att jittera bara data på x-axeln. Detta går tillbaka till Matlab 7.1 (2005), och eventuellt tidigare.
För att aktivera den här funktionen, ställ in 'jitter'
-egenskapen till 'on'
och ställ in 'jitterAmount'
-egenskapen till önskat absolutvärde (standard är 0.2
).
Detta är mycket användbart när vi vill visualisera överlappande data, till exempel:
scatter(ones(1,10), ones(1,10), 'jitter', 'on', 'jitterAmount', 0.5);
Läs mer om Undokumenterad Matlab