ループ処理で回すよう​な処理の際は構造体配​列よりもcell配列​を利用すべきでしょう​か?

23 views (last 30 days)
Tadafumi Sugi
Tadafumi Sugi on 15 Feb 2024
Commented: Tadafumi Sugi on 16 Feb 2024
cell配列と構造体配列の使い分けに関する質問です.

Accepted Answer

Kojiro Saito
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 秒
t1 =
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 秒
t2 =
0.003257
ただ、一つ言えるのはループ処理をまとめて処理したほうが速いです。
  • ベクトル化 — ループベースのコードを記述する代わりに、MATLAB の行列およびベクトル演算の使用を検討します。詳細は、ベクトル化を参照してください。
上記の例を構造体の要素にまとめて処理する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 秒
t3 =
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 秒
t4 =
0.002668
  1 Comment
Tadafumi Sugi
Tadafumi Sugi on 16 Feb 2024
ありがとうございます!
大変勉強になりました.

Sign in to comment.

More Answers (0)

Categories

Find more on ビッグ データの処理 in Help Center and File Exchange

Tags

Products


Release

R2022a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!