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

22 vues (au cours des 30 derniers jours)
Tadafumi Sugi
Tadafumi Sugi le 15 Fév 2024
Commenté : Tadafumi Sugi le 16 Fév 2024
cell配列と構造体配列の使い分けに関する質問です.

Réponse acceptée

Kojiro Saito
Kojiro Saito le 16 Fév 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 commentaire
Tadafumi Sugi
Tadafumi Sugi le 16 Fév 2024
ありがとうございます!
大変勉強になりました.

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Multidimensional Arrays dans Help Center et File Exchange

Tags

Produits


Version

R2022a

Community Treasure Hunt

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

Start Hunting!