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)

linje plot

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] ); 

ange bildbeskrivning här

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] ); 

ange bildbeskrivning här

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

ange bildbeskrivning här

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);

jitter överlappande data

Läs mer om Undokumenterad Matlab



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow