MATLAB Language
記載されていない機能
サーチ…
備考
C ++互換ヘルパー関数
Matlab Coderを使用すると、C ++と互換性がない場合、非常に一般的な関数の使用が拒否されることがあります。比較的頻繁に、 文書化されていないヘルパー関数が存在し、これを置換えとして使用することができます。
ここには、サポートされている機能の包括的なリストがあります。 。
また、サポートされていない機能の代替案のコレクションに続いて、
関数sprintf
とsprintfc
は非常によく似ています。前者は文字配列を返し、後者はセル文字列を返します 。
str = sprintf('%i',x) % returns '5' for x = 5
str = sprintfc('%i',x) % returns {'5'} for x = 5
ただし、 sprintfc
はMatlab CoderがサポートするC ++と互換性があり、 sprintf
はサポートしていません。
3次元のカラーデータを使用した色分けされた2Dラインプロット
R2014bより前のMATLABバージョンでは、古いHG1グラフィックスエンジンを使用して、 カラーコード化された2Dラインプロットを作成する方法は明らかではありませんでした。新しいHG2グラフィックスエンジンのリリースにより、 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)
ラインと散布図の半透明マーカー
Matlab R2014b以来、Yair Altmanによって導入された文書化されていない機能を使用して、ラインと散布図の半透明マーカーを簡単に実現することができます 。
基本的な考え方は、マーカーの隠しハンドルを取得し、 EdgeColorData
最後の値に値<1を適用して、目的の透明度を実現することです。
ここでは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] );
ライン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] );
操作に使用されるマーカーハンドルは、Figureとともに作成されます。 drawnow
コマンドは、後続のコマンドが呼び出される前にFigureの作成を確実にし、遅延の場合のエラーを回避します。
等高線図 - テキストラベルをカスタマイズする
輪郭にラベルを表示する場合Matlabでは、科学的表記法に変更するなど、数値の書式を制御することはできません。
個々のテキストオブジェクトは通常のテキストオブジェクトですが、それらを取得する方法は文書化されていません。輪郭ハンドルの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
注意 : drawnow
コマンドを追加して、Matlabに輪郭線を描画させる必要があります。テキストオブジェクトの数と位置は輪郭が実際に描画されたときにのみ決定され、テキストオブジェクトが作成されます。
等高線が描画されたときにtxtオブジェクトが作成されるという事実は、プロットが再描画されるたびに再計算されることを意味します(例えばFigureのサイズ変更など)。これを管理するには、 undocumented event
れて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
WindowsでMatlab r2015bを使用してテストした例
既存の凡例へのエントリの追加/追加
既存の伝説は管理が難しい場合があります。たとえば、プロットに2つの行があり、そのうちの1つだけに凡例があり、このようにしなければならない場合は、凡例を含む3行目を追加するのは難しい場合があります。例:
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
さて、 tan
凡例エントリを追加するために、 cos
ではなく、次の行はトリックを行いません。彼らはすべて何らかの形で失敗する。
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)
幸いにも、 PlotChildren
と呼ばれる文書化されていない伝説のプロパティは、親の図1の子供を追跡します。そのため、凡例の子を明示的に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
オブジェクトがPlotChildren
プロパティに追加または削除された場合、凡例は自動的に更新されます。
1確かに:数字。 DisplayName
プロパティを持つ任意のFigureの子を、図の任意の凡例、たとえば別のサブプロットから追加できます。これは、凡例自体が基本的に軸オブジェクトですからです。
MATLAB R2016bでテスト済み
散布図ジッタ
scatter
関数には、文書化されていない2つのプロパティ'jitter'
と'jitterAmount'
があり、x軸上のデータだけをジッタさせることができます。これはMatlab 7.1(2005)の日付です。
この機能を有効にするには、 'jitter'
プロパティを'on'
に設定し、 'jitterAmount'
プロパティを希望の絶対値に設定します(デフォルトは0.2
)。
これは、重複するデータを視覚化したい場合に非常に便利です。たとえば、次のようになります。
scatter(ones(1,10), ones(1,10), 'jitter', 'on', 'jitterAmount', 0.5);
未記載のMatlabについてもっと読む