見出し画像

MATLAB R2024a アップデートメモ


まえがき

春ですね。

MATLAB アップデートの季節です。

そろそろ誕生日なのですが、その頃が花粉症の症状が一番ヒドいです。(~_~;)

MATLAB で気晴らしするしかないですね。(-_☆)

気になったアップデート部分を列挙しておきます。

リリースノートをそのまま引用している部分もありますが、例が載っていない場合などは追加しています。


Editor / Live Editor

・スペルチェッカー

エディターにスペルチェッカーが入りました。
 ビュー -> 確認 -> スペル

ただ残念ながら、コメントの日本語も全て引っかかってしまいます。

Visual Studio のは日本語は無視されるようになっているので、そうして欲しいところです。

スペルチェッカー

preferencesフォルダー(> prefdir で表示)/dict/en_US_userDictionary.tdi を直接編集して登録することもできます。


・Date Picker

ライブスクリプトで、カレンダーによる日付選択ができます。

Date Picker


・タスクテンプレート

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

ライブエディターで、今までもスパークラインを個別に表示させることはできましたが、右クリックメニューから一覧表示ができるようになりました。統計量も表示可能です。

スパークライン表示
スパークライン表示
スパークライン表示
スパークライン・統計量表示


R2023b


Data Import and Export

・Secrets in MATLAB Vault

Vault というのは「保管庫」ですね。

ローカルマシンの情報と合わせて AES-256 暗号化して保存できるようです。

例えば、FTP 用パスワードを以下のようにしてダイアログに入力します。

setSecret("SFTPpassword")
パスワード入力ダイアログ

これを使って、ローカルマシンでしか読み出せない "SFTPpassword" として機能するようです。それで合ってる?(;¬_¬) 

s = sftp("sftp.example.net","adam",Password=getSecret("SFTPpassword"));


setSecretMetadatagetSecretMetadata でメタデータの追加もできますが、こっちは平文とのこと。

う~ん、イマイチ使い方が分かりません。

誰か教えてください。 (。・_・。)ノ


Graphics

・Polar Plots

thetaregionradiusregionpolarregion が追加されました。

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

イイね!


・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("-");
linestyleorder


最近の例だと、軸の linear / log 変換は元々 XScale / YScale / ZScale プロパティで変更可能だったのが、xscale / yscalezscale (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);
Quiver Plots

これに "ScaleFactor" プロパティ(読み出し専用)が追加されました。

これを使うと、矢印の先頭に簡単にマーカーを付けたりすることができます。

hold on
xp = x + q.ScaleFactor*u;
yp = y + q.ScaleFactor*v;
scatter(xp,yp,"*r")
hold off
Quiver Plots

もっといっぱいあっても同様にできます。

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")
Quiver Plots


・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
Legends and Rectangles


・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");
region Layer
xr.Layer = "bottom";
xr.Layer = "top";
yl.Layer = "top";


・Bar Charts

グループ間隔設定が設定できるようになりました。

b = bar([2 2 3; 2 5 6; 2 8 9]);
Bar Charts
b(1).GroupWidth = 0.3;
Bar Charts


・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;
CenterLabel


また、donutchart / piechart で、LabelStyle が簡単に指定できるようになりました。

デフォルトは name(パーセンテージ)ですが、data 自体にしたり name だけにしたりできます。

d.LabelStyle = "namedata";
LabelStyle


もっと自由に変えたい場合は、従来通り自分でなんとかします。

d.Labels = d.Names + "\newline" +  " (" + string(hNumSorted) + ")";
2行ラベル


・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
AppDesigner アプリ例


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
uifigure での例


・uislider

RangeSlider で、ステップサイズが指定可能になりました。

fig = uifigure;
s = uislider(fig,"range");
s.Value = [20 80];
s.Step = 10;
RangeSlider

ステップサイズ単位での調整に限定できます。

ただこれ、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";
ラジオボタン


App Designer

・Simulink インターフェース

App Designer で、Simulink モデルと連携するアプリが簡単に作れるようになりました。

作り方は、Simulink モデルの「アプリの設計」、もしくはアプリタブの「アプリの設計」から「Simulink アプリ」を選びます。

Simulink モデルから作成
アプリメニューから作成


AppDesigner 起動後、関連付ける Simulink モデルを選択します。

Simulink モデルの関連付け


コンポーネントライブラリの SIMULINK から使用するコンポーネントを追加します。

コンポーネントライブラリ


例として、Simulation Controls時間スコープを追加してみます。


Simulink モデルの実行結果を取るには、時間スコープを右クリックし、「バインディングの追加」を選択します。

バインディングの追加


すると Simulink モデルが開くので、接続したいラインをクリックし、「接続」します。

ラインの接続


あとはアプリの Run で、Simulink の実行結果をリアルタイムに取ることができます。スゴい!

実行結果表示


ただし表示する信号ラインは、ログが取れる状態になっていることが必要です。

ログが有効な状態

キャンパスの右クリックメニューの
 モデルコンフィギュレーションパラメータ
  -> データのインポート/エクスポート -> 信号のログ
にチェックが入っていないとログは取れません。

データインスペクターもこの状態でないと使えないので注意しましょう。


・コンポーネントの種類変更

今まではコンポーネントを一旦配置してしまうとその種類を後から変えることはできず、消去して置き直すしかありませんでした。

それが今回から、似た種類のコンポーネントは共通プロパティ・共通コールバックを残したまま、種類の変更が可能となりました!

変更可能なのは以下の組み合わせです。

  • Push button <-> state button

  • Tree <-> check box tree

  • List box <-> drop-down <-> discrete knob

右クリックメニューの「置き換え」で行います。

drop-down
プロパティを保持したまま discrete knob へ置き換え


共通ではない追加済みコールバック関数は置き変わらずにそのまま残ります。不要になったら手動で消します。

リンク元のないコールバック関数は、コードブラウザー -> コールバック で ⚠️ マークが付きます。


待望の機能ですね!


・Grid Layout Manager

これはスゴい!


グリッドレイアウトを使いながら、自由自在にレイアウト変更ができます。

自由レイアウトで作ったアプリも、一発で変換して使えます。

JUCE とかにも欲しい!


Simulink

・diagram layout

ブロックサイズを変えたりしてもラインが崩れないようになりました。


・信号ライン -> Goto / From 変換

信号ラインを Goto / From ブロックに直接変換できるようになりました。

Goto / From ブロック変換


引き回しが長くなってしまって Goto / From に変えたい場合は結構あります。

一旦削除する必要がないので間違いもなく、楽ですね。


・C Function block

以前はヘッダーファイルをモデルコンフィグレーションパラメータに書いていたのでモデル毎でしたが、ブロック毎にカスタムコードを書けるようになりました。

ブロックのカスタムコードを使用


・quick insert

キャンパス上でダブルクリック、もしくは検索ワード入力で出るブロック検索画面で、アイコンも表示されるようになりました。

quick insert

似たようなブロックをアイコンで判別してる場合もあるので、なにげに便利かも。


Audio Toolbox

・audioViewer

音声ファイルビューアーが追加されました。

audioViewer("FunkyDrums-44p1-stereo-25secs.mp3")
audioViewer

再生位置、再生区間、再生速度等を変えられますが、パフォーマンスはあまりよろしくありません。

別のオーディオアプリを使った方が良いと思いますが、まあ MATLAB 内でちょっと確認するには便利ですね。


・SOFA

空間音響用ファイルフォーマットである SOFA に対し、一気に以下のビジュアライズ関数が追加されました。

findMeasurementsplotGeometry
interauralLevelDifferenceinterauralTimeDifference
energyTimeCurvedirectivityfreqzimpzspectrum

まあこの辺りは関係ある人にしか関係ないと思いますので、関係者はじっくり見てみてください。

私もまだよく見てません。

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)
SOFA 各種ビジュアライズ



・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)
loudnessMeter


レベルメーター表示もできます。

loudnessMeter

R2023bではこんな表示でした。

loudnessMeter(R2023b)



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

fvtool の代わりですかね?
filterDesigner とかもありますよね?

普段フィルターはたいていフルスクラッチで自分で設計するので、実はこういうツールはあまり使ったことがありません。(そんなたいしたフィルターは使わないので)

なので前との違いがよく分かりません。(^^;

コマンドラインで filterAnalyzer でも起動し、ワークスペースからインポートしたりもできます。


・Random Source block

Mersenne Twister(メルセンヌ・ツイスタ)アルゴリズムが(やっと)実装されました。

二人の日本人によって考案された、高品質な疑似乱数発生アルゴリズムです。

その他にも細かい変更があるようで、ブロック自体が新しくなりました。

R2024a で古いモデルを読み込んでも更新はされないので、自分でブロックを置き換える必要があります。 


・Design Filter

ライブエディターのタスクに入りました。

タスク

ライブエディター上で手軽に実行できます。

ライブエディターでの実行


Performance

毎度のことながら、全般的に処理速度が上がっています。

各自確認して小躍りしてください。


よくある、マシンパワーの向上に甘えきったソフトは、少しは見習ってほしいものです。


あとがき

過去にも、アップデート関連の記事は書いています。


しかし今回、思ったより気になるのが多くて、るんるん気分で書き始めたのに、永遠に終わらなさそうな気がして死にかけました。(;´Д`)

まだまだあるんですがそれは各人のお楽しみということで・・。

次回もやるとしたら、もっと範囲を絞ろうかと思います!


この記事が参加している募集

仕事のコツ

with 日本経済新聞

この記事が気に入ったらサポートをしてみませんか?