![見出し画像](https://assets.st-note.com/production/uploads/images/133245459/rectangle_large_type_2_773ee98d3a97ba9388abdcea42def321.jpeg?width=1200)
MATLAB R2024a アップデートメモ
まえがき
春ですね。
MATLAB アップデートの季節です。
そろそろ誕生日なのですが、その頃が花粉症の症状が一番ヒドいです。(~_~;)
MATLAB で気晴らしするしかないですね。(-_☆)
気になったアップデート部分を列挙しておきます。
リリースノートをそのまま引用している部分もありますが、例が載っていない場合などは追加しています。
Editor / Live Editor
・スペルチェッカー
エディターにスペルチェッカーが入りました。
ビュー -> 確認 -> スペル
ただ残念ながら、コメントの日本語も全て引っかかってしまいます。
Visual Studio のは日本語は無視されるようになっているので、そうして欲しいところです。
![](https://assets.st-note.com/img/1710982338032-24JR2gVmsY.png?width=1200)
preferencesフォルダー(> prefdir で表示)/dict/en_US_userDictionary.tdi を直接編集して登録することもできます。
・Date Picker
ライブスクリプトで、カレンダーによる日付選択ができます。
![](https://assets.st-note.com/img/1710982693592-FzbX6my9g8.png)
・タスクテンプレート
LiveEditorのタスクにテンプレートが追加されました。
必要部分を埋めていけばタスクが作れます。
挿入 -> タスク -> ライブタスククラス
Language and Programming
・Local Functions
スクリプト/ライブスクリプトで、ローカル関数が好きな場所
(条件文やループ内以外)に置けるようになりました。
以前は最後にしか置けませんでした。
x = 1:10;
n = length(x);
function a = mymean(v,n)
a = sum(v)/n;
end
mymean(x,n)
・Function Input Arguments
function作成後、先頭に "argu~" を入力してリターンすると、自動的に引数込みの arguments ブロックが作成されるようになりました。
function [a,s] = addSub2Values(a,b)
a = a + b;
s = a - b;
end
function [a,s] = addSub2Values(a,b)
argu
a = x + y;
s = x - y;
end
function [a,s] = addSub2Values(x,y)
arguments
x
y
end
a = x + y;
s = x - y;
end
Data Analysis
・mean and median Functions
重み付け平均ができるようになりました。
A = [1 1; 7 9; 1 9; 1 9; 6 2];
W = [1 2 1 2 3]';
M = mean(A,Weights=W)
M = 1×2
4.0000 5.7778
・View sparklines and summary statistics for tables
ライブエディターで、今までもスパークラインを個別に表示させることはできましたが、右クリックメニューから一覧表示ができるようになりました。統計量も表示可能です。
![](https://assets.st-note.com/img/1710983173529-TQWfcGmpaZ.png?width=1200)
![](https://assets.st-note.com/img/1710983192982-uRHvcW5IFy.png?width=1200)
![](https://assets.st-note.com/img/1710983231991-POA7ZBOfaY.png?width=1200)
![](https://assets.st-note.com/img/1710983541348-S3kO6IKsCH.png?width=1200)
![](https://assets.st-note.com/img/1710983197009-y3gavd474A.png)
Data Import and Export
・Secrets in MATLAB Vault
Vault というのは「保管庫」ですね。
ローカルマシンの情報と合わせて AES-256 暗号化して保存できるようです。
例えば、FTP 用パスワードを以下のようにしてダイアログに入力します。
setSecret("SFTPpassword")
![](https://assets.st-note.com/img/1709858659749-6zRkx1KHGT.png)
これを使って、ローカルマシンでしか読み出せない "SFTPpassword" として機能するようです。それで合ってる?(;¬_¬)
s = sftp("sftp.example.net","adam",Password=getSecret("SFTPpassword"));
setSecretMetadata / getSecretMetadata でメタデータの追加もできますが、こっちは平文とのこと。
う~ん、イマイチ使い方が分かりません。
誰か教えてください。 (。・_・。)ノ
Graphics
・Polar Plots
thetaregion、radiusregion、polarregion が追加されました。
theta = 0:0.01:2*pi;
rho = sin(2*theta).*cos(2*theta);
pax = polaraxes;
polarplot(pax,theta,rho)
thetaregion(pax,0,pi/4,FaceColor="r")
radiusregion(pax,0.2,0.3,FaceColor="g")
thetas = [pi/2 3*pi/2];
radii = [0.3 0.4];
polarregion(pax,thetas,radii,FaceColor="b",FaceAlpha=0.1)
![](https://assets.st-note.com/img/1709832821754-lgr18apSGW.png)
イイね!
・linestyleorder
ラインスタイルの表示順は今までも座標軸プロパティで変更可能でしたが、関数として独立しました。より簡単に変えられるようになりました。
Y = (10:15)'- (0:5);
plot(Y,LineWidth=1)
filename = 'linestyleorder.gif';
for k=1:4
switch k
case 1
linestyleorder("mixedstyles")
case 2
linestyleorder("mixedmarkers")
case 3
linestyles = ["-","-o","--d"];
linestyleorder(linestyles)
case 4
colors = orderedcolors("glow");
colororder(colors(4:6,:))
end
drawnow
frame = getframe(gcf);
im = frame2im(frame);
[A, map] = rgb2ind(im, 256);
if k == 1
imwrite(A, map, filename, 'gif', 'LoopCount', Inf, 'DelayTime', 1);
else
imwrite(A, map, filename, 'gif', 'WriteMode', 'append', 'DelayTime', 1);
end
end
% reset to default
colororder("default")
linestyleorder("-");
![](https://assets.st-note.com/production/uploads/images/133240608/picture_pc_0c172a17362e72b91906750b55103bce.gif)
最近の例だと、軸の linear / log 変換は元々 XScale / YScale / ZScale プロパティで変更可能だったのが、xscale / yscale / zscale (R2023b~)が追加されましたね。
・rgb2hex / hex2rgb
カラーコード用表示形式変換関数が追加されました。
色々な語長フォーマットが指定できます。
>> RGB = [0.60 0.30 0.80];
rgb2hex(RGB)
ans =
"#994DCC"
>> RGB = uint8([153 77 204]);
rgb2hex(RGB)
ans =
"#994DCC"
>> rgb2hex(RGB,Shorthand=true)
ans =
"#95C"
>> hexStr = "#CD00EF";
hex2rgb(hexStr)
ans =
0.8039 0 0.9373
>> hex2rgb(hexStr,OutputType="uint16")
ans =
1×3 の uint16 行ベクトル
52685 0 61423
>> hexStr = "#F00";
hex2rgb(hexStr)
ans =
1 0 0
・Quiver Plots
quiver は、指定座標からのベクトルが描画できる関数です。
x = [1 2 3];
y = [0 1.3 1];
u = [1.5 -2 1];
v = [1 1.5 3];
q = quiver(x,y,u,v);
![](https://assets.st-note.com/img/1709835923747-EGvHPoYfYc.png)
これに "ScaleFactor" プロパティ(読み出し専用)が追加されました。
これを使うと、矢印の先頭に簡単にマーカーを付けたりすることができます。
hold on
xp = x + q.ScaleFactor*u;
yp = y + q.ScaleFactor*v;
scatter(xp,yp,"*r")
hold off
![](https://assets.st-note.com/img/1709835935445-Yjg2pZVvlK.png)
もっといっぱいあっても同様にできます。
load('wind','x','y','u','v')
X = x(11:22,11:22,1);
Y = y(11:22,11:22,1);
U = u(11:22,11:22,1);
V = v(11:22,11:22,1);
q = quiver(X,Y,U,V);
axis equal
hold on
xp = X + q.ScaleFactor*U;
yp = Y + q.ScaleFactor*V;
scatter(xp,yp,"*r")
![](https://assets.st-note.com/img/1709836061927-LZ7CdR9eeI.png)
・Legends and Rectangles
凡例の背景と rectangle で、透明度が指定可能になりました。
legend の透明度対応は嬉しいですね!
rng default
p = plot(rand(10,3)*10);
l = legend;
l.FontSize = 24;
l.BackgroundAlpha = 0.5;
axis equal
hold on
rectangle('Position',[2 2 6 5],FaceColor="r",FaceAlpha=0.1)
rectangle('Position',[4 3 5 5],'Curvature',[1 1],FaceColor="b",FaceAlpha=0.3)
hold off
![](https://assets.st-note.com/img/1709837109231-u4bjbLULRo.png)
・xline / yline、xregion / yregion
レイヤー順を指定できるようになりました。
デフォルトでは "bottom" です。
plot([0 1; 1 2; 2 3; 3 4; 4 5; 5 6])
xregion(2,3,FaceAlpha=1,FaceColor=[0.6 0.7 0.9])
yl = yline(3);
xr = xregion([4 5],FaceAlpha=1,FaceColor=[0.95 0.7 0.6],Layer="top");
![](https://assets.st-note.com/img/1709838508776-djTzmvPYFX.png)
![](https://assets.st-note.com/img/1710984036337-fBuS83kpiR.png)
![](https://assets.st-note.com/img/1710984043198-bze1NMi383.png)
![](https://assets.st-note.com/img/1710984051445-Cw5UTcw205.png)
・Bar Charts
グループ間隔設定が設定できるようになりました。
b = bar([2 2 3; 2 5 6; 2 8 9]);
![](https://assets.st-note.com/img/1709839700258-rDIAoWZ3Sx.png)
b(1).GroupWidth = 0.3;
![](https://assets.st-note.com/img/1709839706899-DBRFywySP7.png)
・Donut and Pie Charts
donutchart にセンターラベルが追加されました。
str = "You say yes, I say no, You say stop and I say go go go.";
% split words
pat = " " | "," | "." | "and";
words = split(str,pat);
words = lower(words);
words(words == "") = [];
[w,~,idx] = unique(words);
hNum = histcounts(idx,numel(w));
[hNumSorted,idx2] = sort(hNum,'descend');
wSorted = w(idx2);
w2 = categorical(words);
rank2 = reordercats(w2,wSorted);
d = donutchart(rank2);
d.CenterLabel = ["Hello," "Goodby"];
d.CenterLabelFontSize = 20;
![](https://assets.st-note.com/img/1709843518628-ZUN8W0Kt6f.png)
また、donutchart / piechart で、LabelStyle が簡単に指定できるようになりました。
デフォルトは name(パーセンテージ)ですが、data 自体にしたり name だけにしたりできます。
d.LabelStyle = "namedata";
![](https://assets.st-note.com/img/1709843621587-xgSXDyImAt.png)
もっと自由に変えたい場合は、従来通り自分でなんとかします。
d.Labels = d.Names + "\newline" + " (" + string(hNumSorted) + ")";
![](https://assets.st-note.com/img/1709847264313-8CZSQdnzI4.png)
・hold、axis、box、grid
on/off 以外に、 0/1, false/true が使えるようになりました。
プログラミング上は便利かも?
手打ちの時も 0/1 だと早いですね。
App Building
・uicolorpicker
カラーピッカーが、uifgure や AppDesigner 内で使えるようになりました。
例えば AppDesigner では以下のようにして、円の塗り色をカラーピッカーで指定した色に変更することができます。
実際に自分で書くコードは5行ですね。
properties (Access = private)
rect
end
% Callbacks that handle component events
methods (Access = private)
% Code that executes after component creation
function startupFcn(app)
app.rect = rectangle(app.UIAxes,'Position',[4 3 5 5], ...
'Curvature',[1 1],FaceColor="b");
axis(app.UIAxes,"equal")
app.ColorPicker.Value = app.rect.FaceColor; % カラーピッカーの初期色設定
end
% Callback function: ColorPicker
function ColorPickerValueChanged(app, event)
value = app.ColorPicker.Value;
app.rect.FaceColor = value;
end
end
![](https://assets.st-note.com/img/1709911101736-MmsDkvuAHe.png?width=1200)
uifigure でやる場合は例えば以下のようになります。
fig = uifigure;
g = uigridlayout(fig);
g.RowHeight = {'1x','fit'};
g.ColumnWidth = {'1x','1x','1x','1x'};
ax = uiaxes(g);
ax.Layout.Row = 1;
ax.Layout.Column = [1 4];
rect = rectangle(ax,'Position',[4 3 5 5], ...
'Curvature',[1 1],FaceColor="b");
axis(ax,"equal")
c = uicolorpicker(g, ...
Value=rect.FaceColor, ...
ValueChangedFcn=@(src,event) updateColor(src,event,rect));
c.Layout.Row = 2;
c.Layout.Column = [2 3];
function updateColor(src,event,rect)
val = event.Value;
rect.FaceColor = val;
end
![](https://assets.st-note.com/img/1709913231762-4END8ClXLB.png)
・uislider
RangeSlider で、ステップサイズが指定可能になりました。
fig = uifigure;
s = uislider(fig,"range");
s.Value = [20 80];
s.Step = 10;
![](https://assets.st-note.com/img/1709913933085-wV56ZgSmre.png)
ステップサイズ単位での調整に限定できます。
ただこれ、RangeSlider のみで、普通の Slider にはありません。
なぜ?
・uiradiobutton
ラジオボタンのテキストがマークアップに対応しました。数式も表示できます。
fig = uifigure('Position',[300 300 400 300]);
bg = uibuttongroup(fig,'Position',[50 50 300 200]);
rb1 = uiradiobutton(bg,'Position',[10 150 300 40],"Interpreter","latex");
rb2 = uiradiobutton(bg,'Position',[10 100 100 40]);
rb3 = uiradiobutton(bg,'Position',[10 50 100 40]);
% rb1.Text = '<$$\int_{-\infty} ^\infty x^2 dx$$>';
rb1.Text = '<$$F(\omega) = \int_{-\infty}^{\infty} f(t) e^{-j\omega t} dt$$>';
rb1.FontSize = 18;
rb2.Interpreter = "html";
rb2.Text = '<p style="color: red;">html</p>';
rb3.Text = 'Text';
rb3.FontColor = "magenta";
![](https://assets.st-note.com/img/1710873973837-B2TinzHsq8.png)
App Designer
・Simulink インターフェース
App Designer で、Simulink モデルと連携するアプリが簡単に作れるようになりました。
作り方は、Simulink モデルの「アプリの設計」、もしくはアプリタブの「アプリの設計」から「Simulink アプリ」を選びます。
![](https://assets.st-note.com/img/1710985230401-P4raIQ8EVr.png?width=1200)
![](https://assets.st-note.com/img/1710985347310-fSGkF4y10D.png)
AppDesigner 起動後、関連付ける Simulink モデルを選択します。
![](https://assets.st-note.com/img/1710985486809-fNO2WzYpPP.png)
コンポーネントライブラリの SIMULINK から使用するコンポーネントを追加します。
![](https://assets.st-note.com/img/1710985621308-8amrdcj6aX.png?width=1200)
例として、Simulation Controls と 時間スコープを追加してみます。
Simulink モデルの実行結果を取るには、時間スコープを右クリックし、「バインディングの追加」を選択します。
![](https://assets.st-note.com/img/1710985786508-ThxAeorQlQ.png?width=1200)
すると Simulink モデルが開くので、接続したいラインをクリックし、「接続」します。
![](https://assets.st-note.com/img/1710986089603-vOaTuYr73Q.png?width=1200)
あとはアプリの Run で、Simulink の実行結果をリアルタイムに取ることができます。スゴい!
![](https://assets.st-note.com/img/1710986234225-AdhLvHtFwb.png?width=1200)
ただし表示する信号ラインは、ログが取れる状態になっていることが必要です。
![](https://assets.st-note.com/img/1710986400906-ZOU5Cfmo0u.png?width=1200)
キャンパスの右クリックメニューの
モデルコンフィギュレーションパラメータ
-> データのインポート/エクスポート -> 信号のログ
にチェックが入っていないとログは取れません。
データインスペクターもこの状態でないと使えないので注意しましょう。
・コンポーネントの種類変更
今まではコンポーネントを一旦配置してしまうとその種類を後から変えることはできず、消去して置き直すしかありませんでした。
それが今回から、似た種類のコンポーネントは共通プロパティ・共通コールバックを残したまま、種類の変更が可能となりました!
変更可能なのは以下の組み合わせです。
Push button <-> state button
Tree <-> check box tree
List box <-> drop-down <-> discrete knob
右クリックメニューの「置き換え」で行います。
![](https://assets.st-note.com/img/1710437374430-BBpIbpubDA.png)
![](https://assets.st-note.com/img/1710437374480-75ObLCxj2R.png)
共通ではない追加済みコールバック関数は置き変わらずにそのまま残ります。不要になったら手動で消します。
リンク元のないコールバック関数は、コードブラウザー -> コールバック で ⚠️ マークが付きます。
待望の機能ですね!
・Grid Layout Manager
これはスゴい!
グリッドレイアウトを使いながら、自由自在にレイアウト変更ができます。
自由レイアウトで作ったアプリも、一発で変換して使えます。
JUCE とかにも欲しい!
Simulink
・diagram layout
ブロックサイズを変えたりしてもラインが崩れないようになりました。
R2024aPre、ブロックサイズ変えても
— leftbank (@cafe_on_the) December 22, 2023
ライン崩れないの胸熱#MATLAB#Simulink pic.twitter.com/0P5MklNZFb
・信号ライン -> Goto / From 変換
信号ラインを Goto / From ブロックに直接変換できるようになりました。
![](https://assets.st-note.com/img/1709860534093-GR4KtJZv1y.png)
引き回しが長くなってしまって Goto / From に変えたい場合は結構あります。
一旦削除する必要がないので間違いもなく、楽ですね。
・C Function block
以前はヘッダーファイルをモデルコンフィグレーションパラメータに書いていたのでモデル毎でしたが、ブロック毎にカスタムコードを書けるようになりました。
![](https://assets.st-note.com/img/1709861849018-HWpoPqgdYf.png?width=1200)
・quick insert
キャンパス上でダブルクリック、もしくは検索ワード入力で出るブロック検索画面で、アイコンも表示されるようになりました。
![](https://assets.st-note.com/img/1710008572099-WquohZU7Qv.png)
似たようなブロックをアイコンで判別してる場合もあるので、なにげに便利かも。
Audio Toolbox
・audioViewer
音声ファイルビューアーが追加されました。
audioViewer("FunkyDrums-44p1-stereo-25secs.mp3")
![](https://assets.st-note.com/img/1709847930239-UUCQV0HwaY.png?width=1200)
再生位置、再生区間、再生速度等を変えられますが、パフォーマンスはあまりよろしくありません。
別のオーディオアプリを使った方が良いと思いますが、まあ MATLAB 内でちょっと確認するには便利ですね。
・SOFA
空間音響用ファイルフォーマットである SOFA に対し、一気に以下のビジュアライズ関数が追加されました。
findMeasurements、plotGeometry
interauralLevelDifference、interauralTimeDifference
energyTimeCurve、directivity、freqz、impz、spectrum
まあこの辺りは関係ある人にしか関係ないと思いますので、関係者はじっくり見てみてください。
私もまだよく見てません。
tiledlayout(4,3)
s = sofaread('ReferenceHRTF.sofa');
nexttile
plotGeometry(s)
nexttile
idx = findMeasurements(s,Plane="median");
plotGeometry(s,MeasurementIndex=idx)
nexttile
impz(s, MeasurementIndex=1:3,Receiver=2)
nexttile
idx = findMeasurements(s, Plane="horizontal");
freqz(s, MeasurementIndex=idx(1:3), Receiver=1)
nexttile
[S,F,azi] = spectrum(s, Plane="horizontal",Receiver=1, NPoints=2048);
spectrum(s, Plane="horizontal",Receiver=1, NPoints=2048);
nexttile
energyTimeCurve(s)
nexttile
interauralTimeDifference(s, Specification="measurements");
nexttile
interauralTimeDifference(s, Plane="horizontal",PlaneOffsetAngle=35)
nexttile
interauralLevelDifference(s)
nexttile
directivity(s, 200, Specification="measurements")
nexttile
directivity(s, 4000, Specification="measurements")
nexttile
directivity(s, [700 1200], PlaneOffsetAngle=35, Receiver=1)
![](https://assets.st-note.com/img/1709849375964-mBwIOT9g5t.png?width=1200)
・loudnessMeter
少しモダンな感じになりましたかね。
UI での機能も増えました。
fileReader = dsp.AudioFileReader('RockDrums-44p1-stereo-11secs.mp3');
loudMtr = loudnessMeter('SampleRate',fileReader.SampleRate);
visualize(loudMtr)
momentary = [];
shortTerm = [];
integrated = [];
while ~isDone(fileReader)
x = fileReader();
[m,s,i] = loudMtr(x);
momentary = [momentary;m];
shortTerm = [shortTerm;s];
integrated = [integrated;i];
end
release(fileReader)
![](https://assets.st-note.com/img/1709845012861-mcfQb7sR6g.png)
レベルメーター表示もできます。
![](https://assets.st-note.com/img/1709845025698-orae2W1GPO.png)
R2023bではこんな表示でした。
![](https://assets.st-note.com/img/1709845231618-6PtggopzrK.png?width=1200)
DSP System Toolbox
・filterAnalyzer
フィルター解析ツールが新しくなったようです。
[z,p,k] = ellip(5,5,60,[0.2 0.45]);
[bb,aa] = zp2ctf(z,p,k,SectionOrder=4);
dfir = designfilt("bandpassfir", ...
SampleRate=2e3,PassbandRipple=5, ...
StopbandFrequency1=500,PassbandFrequency1=600, ...
StopbandAttenuation1=80, ...
PassbandFrequency2=750,StopbandFrequency2=900, ...
StopbandAttenuation2=40);
fa = filterAnalyzer(bb,aa,dfir,FilterNames=["ellip" "dfir"]);
![](https://assets.st-note.com/img/1709856710156-9vuSeBO1DX.png?width=1200)
fvtool の代わりですかね?
filterDesigner とかもありますよね?
普段フィルターはたいていフルスクラッチで自分で設計するので、実はこういうツールはあまり使ったことがありません。(そんなたいしたフィルターは使わないので)
なので前との違いがよく分かりません。(^^;
コマンドラインで filterAnalyzer でも起動し、ワークスペースからインポートしたりもできます。
・Random Source block
Mersenne Twister(メルセンヌ・ツイスタ)アルゴリズムが(やっと)実装されました。
二人の日本人によって考案された、高品質な疑似乱数発生アルゴリズムです。
その他にも細かい変更があるようで、ブロック自体が新しくなりました。
R2024a で古いモデルを読み込んでも更新はされないので、自分でブロックを置き換える必要があります。
・Design Filter
ライブエディターのタスクに入りました。
![](https://assets.st-note.com/img/1709857803172-zgCuwqCa0b.png?width=1200)
ライブエディター上で手軽に実行できます。
![](https://assets.st-note.com/img/1709858020837-NOMIcdHhlg.png?width=1200)
Performance
毎度のことながら、全般的に処理速度が上がっています。
各自確認して小躍りしてください。
フリーハンドグライコ
— leftbank (@cafe_on_the) January 30, 2024
App Designer アプリでグラフを描くと反応が鈍い・・
でもこれ、R2023b だと致命的に遅いのに
Pre版だとほぼ問題なく動く
なので私はいつも、プリリリース版出れば
すぐメインで使う
しかしやはり、VST でもこういうのできるようにして欲しい!#MATLAB#R2024a#Prerelease pic.twitter.com/3BpBve0Yqd
よくある、マシンパワーの向上に甘えきったソフトは、少しは見習ってほしいものです。
あとがき
過去にも、アップデート関連の記事は書いています。
しかし今回、思ったより気になるのが多くて、るんるん気分で書き始めたのに、永遠に終わらなさそうな気がして死にかけました。(;´Д`)
まだまだあるんですがそれは各人のお楽しみということで・・。
次回もやるとしたら、もっと範囲を絞ろうかと思います!