- ベクトル化 — ループベースのコードを記述する代わりに、MATLAB の行列およびベクトル演算の使用を検討します。詳細は、ベクトル化を参照してください。
ループ処理で回すような処理の際は構造体配列よりもcell配列を利用すべきでしょうか?
21 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Tadafumi Sugi
am 15 Feb. 2024
Kommentiert: Tadafumi Sugi
am 16 Feb. 2024
cell配列と構造体配列の使い分けに関する質問です.
0 Kommentare
Akzeptierte Antwort
Kojiro Saito
am 16 Feb. 2024
一概に構造体とセル配列でどちらのほうがループが速いとは言い切れず、繰り返し数nの値にも依ってきます。下記の例では各要素の値を2倍する処理ですが、n=100000で構造体のほうが速いですが、n=100とかだとセル配列のほうが速かったです。
構造体でforループ
format shortG
n = 100000;
numData = ones(n,1);
strData = struct;
strData.data1 = numData;
strData.data2 = numData;
fnames = fieldnames(strData);
tic
for n=1:length(fnames)
strData.(fnames{n}) = strData.(fnames{n}) * 2;
end
t1=toc % 0.002765 秒
セル配列でforループ
clear all
n = 100000;
numData = ones(n,1);
cellData = cell(1,2);
[cellData{:}] = deal(numData);
tic
for n=1:length(cellData)
cellData{n} = cellData{n} * 2;
end
t2=toc % 0.003257 秒
ただ、一つ言えるのはループ処理をまとめて処理したほうが速いです。
参考:パフォーマンス向上の手法
上記の例を構造体の要素にまとめて処理するstructfun、セル配列でまとめて処理するcellfunを使ってみますと下記のようになります。
structfunで構造体をまとめて処理
clear all
n = 100000;
numData = ones(n,1);
strData = struct;
strData.data1 = numData;
strData.data2 = numData;
tic
strData = structfun(@(x) x*2, strData, 'UniformOutput', false);
t3=toc % 0.00203 秒
cellfunでセル配列をまとめて処理
clear all
n = 100000;
numData = ones(n,1);
cellData = cell(1,2);
[cellData{:}] = deal(numData);
tic
cellData = cellfun(@(x) x*2, cellData, 'UniformOutput', false);
t4=toc % 0.002668 秒
Weitere Antworten (0)
Siehe auch
Kategorien
Mehr zu ビッグ データの処理 finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!