Ricerca…


Osservazioni

  • L'utilizzo di funzionalità non documentate è considerato una pratica rischiosa 1 , in quanto queste funzionalità potrebbero cambiare senza preavviso o semplicemente funzionare in modo diverso su versioni diverse di MATLAB. Per questo motivo, si consiglia di utilizzare tecniche di programmazione difensive come l'inclusione di pezzi di codice non documentati all'interno di blocchi try/catch con fallback documentati.

Funzioni di supporto compatibili con C ++

L'uso di Matlab Coder a volte nega l'uso di alcune funzioni molto comuni, se non sono compatibili con C ++. Relativamente spesso esistono funzioni di supporto non documentate , che possono essere utilizzate come sostituti.

Ecco un elenco completo delle funzioni supportate. .

E seguendo una raccolta di alternative, per le funzioni non supportate:


Le funzioni sprintf e sprintfc sono abbastanza simili, il primo restituisce un array di caratteri , il secondo una stringa di celle :

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

Tuttavia, sprintfc è compatibile con C ++ supportato da Matlab Coder e sprintf no.

Tracciati 2D con codice colore con dati colore in terza dimensione

Nelle versioni MATLAB precedenti a R2014b , utilizzando il vecchio motore grafico HG1, non era ovvio come creare grafici a linee 2D codificati a colori . Con il rilascio del nuovo motore grafico HG2 è nata una nuova funzionalità non documentata introdotta da 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)

trama di linea

Marcatori semi-trasparenti in linea e grafici a dispersione

Dal momento che Matlab R2014b è facilmente possibile ottenere marcatori semitrasparenti per i grafici a linee e a dispersione usando le caratteristiche non documentate introdotte da Yair Altman .

L'idea di base è ottenere l'handle nascosto dei marker e applicare un valore <1 per l'ultimo valore in EdgeColorData per ottenere la trasparenza desiderata.

Qui andiamo per 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] ); 

inserisci la descrizione dell'immagine qui

e per un plot linee

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

inserisci la descrizione dell'immagine qui

Le maniglie dell'indicatore, che sono usate per la manipolazione, sono create con la figura. Il comando drawnow garantisce la creazione della figura prima che vengano richiamati i comandi successivi ed evita errori in caso di ritardi.

Profili di contorno: personalizza le etichette di testo

Quando si visualizzano le etichette sui contorni Matlab non consente di controllare il formato dei numeri, ad esempio per passare alla notazione scientifica.

I singoli oggetti di testo sono normali oggetti di testo, ma il modo in cui li ottieni è non documentato. Puoi accedervi dalla proprietà TextPrims dell'impugnatura del contorno.

  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

Nota : è necessario aggiungere un comando drawnow per forzare Matlab a disegnare i contorni, il numero e la posizione degli oggetti txt sono determinati solo quando i contorni sono effettivamente disegnati in modo che gli oggetti di testo vengano creati solo allora.

Il fatto che gli oggetti txt vengano creati quando vengono disegnati i contorni significa che vengono ricalcolati ogni volta che la trama viene ridisegnata (ad esempio ridimensionamento della figura). Per gestirlo è necessario ascoltare 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

inserisci la descrizione dell'immagine qui

Esempio testato con Matlab r2015b su Windows

Aggiunta / aggiunta di voci a una legenda esistente

Le leggende esistenti possono essere difficili da gestire. Ad esempio, se la trama ha due linee, ma solo una di esse ha una voce della legenda e che dovrebbe rimanere in questo modo, l'aggiunta di una terza riga con una voce della legenda può essere difficile. Esempio:

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

Ora, per aggiungere una voce di legenda per l' tan , ma non per cos , nessuna delle seguenti righe non farà il trucco; falliscono tutti in qualche modo:

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)

Fortunatamente, una proprietà di legenda non documentata chiamata PlotChildren tiene traccia dei figli della figura genitore 1 . Quindi, la strada da percorrere è impostare esplicitamente i figli della legenda attraverso la sua proprietà PlotChildren come segue:

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 legenda si aggiorna automaticamente se un oggetto viene aggiunto o rimosso dalla sua proprietà PlotChildren .

1 Infatti: figura. È possibile aggiungere il figlio di qualsiasi figura con la proprietà DisplayName a qualsiasi legenda nella figura, ad esempio da un sottotramma diverso. Questo perché una leggenda di per sé è fondamentalmente un oggetto di assi.

Testato su MATLAB R2016b

Dispersione della trama dispersa

La funzione scatter ha due proprietà non documentate 'jitter' e 'jitterAmount' che consentono di 'jitterAmount' i dati sull'asse x solo. Questo risale a Matlab 7.1 (2005), e forse prima.

Per abilitare questa funzione, impostare la proprietà 'jitter' su 'on' e impostare la proprietà 'jitterAmount' sul valore assoluto desiderato (il valore predefinito è 0.2 ).

Questo è molto utile quando vogliamo visualizzare dati sovrapposti, ad esempio:

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

jitter che si sovrappone ai dati

Maggiori informazioni su Matlab non documentato



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow