- ベクトル化 — ループベースのコードを記述する代わりに、MATLAB の行列およびベクトル演算の使用を検討します。詳細は、ベクトル化を参照してください。
ループ処理で回すような処理の際は構造体配列よりもcell配列を利用すべきでしょうか?
조회 수: 25 (최근 30일)
이전 댓글 표시
cell配列と構造体配列の使い分けに関する質問です.
댓글 수: 0
채택된 답변
Kojiro Saito
2024년 2월 16일
一概に構造体とセル配列でどちらのほうがループが速いとは言い切れず、繰り返し数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 秒
추가 답변 (0개)
참고 항목
카테고리
Help Center 및 File Exchange에서 ビッグ データの処理에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!