- ベクトル化 — ループベースのコードを記述する代わりに、MATLAB の行列およびベクトル演算の使用を検討します。詳細は、ベクトル化を参照してください。
ループ処理で回すような処理の際は構造体配列よりもcell配列を利用すべきでしょうか?
25 views (last 30 days)
Show older comments
Tadafumi Sugi
on 15 Feb 2024
Commented: Tadafumi Sugi
on 16 Feb 2024
cell配列と構造体配列の使い分けに関する質問です.
0 Comments
Accepted Answer
Kojiro Saito
on 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 秒
More Answers (0)
See Also
Categories
Find more on ビッグ データの処理 in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!