MATLAB Answers

マットファイルに格納​されている構造体配列​の要素の結合について

6 views (last 30 days)
matfile1
S1.a = 1
S1.b = [2,3]
S1.c = 'test1'
-------------------------------------
matfile2
S1.a = 2
S1.b = [4,5]
S1.c = 'test2'
--------------------------------------
があった場合、
--------------------------------------
matfile3
S1.a = [1,2]
S1.b = [2,3,4,5]
S1.c = ['test1' ,'test2']
-----------------------------------
それらの要素を上記のように一つの構造体配列にしマットファイルにまとめたいのですが不可能でしょうか。行数は同じのほうが嬉しいです。
また、今回はmatfileが2つですが、やりたいこととしては、大量のマットファイルを一つにまとめたいです。

Accepted Answer

Hernia Baby
Hernia Baby on 8 Sep 2021
構造体の連結は以下のようになります
matfile1 = load("matfile1.mat");
matfile2 = load("matfile2.mat");
matfile3 = [matfile1.S1; matfile2.S1]
matfile3 = 2×1 struct array with fields:
a b c
中身を見てみましょう
matfile3.a
ans = 1
ans = 2
matfile3.b
ans = 1×2
2 3
ans = 1×2
4 5
matfile3.c
ans = 'test1'
ans = 'test2'
完全に結合させたい場合は一度cell型にします
A = struct2cell(matfile3);
name = fieldnames(matfile3);
for i = 1:size(A,1)
Output.(name{i}) = [A{i,1}, A{i,2}];
end
Output
Output = struct with fields:
a: [1 2] b: [2 3 4 5] c: 'test1test2'
ちなみに
['test1' ,'test2']
ans = 'test1test2'
となります
  3 Comments
takeru misawa
takeru misawa on 9 Sep 2021
ご教授いただきありがとうございます。一つ一つ理解していきたいと思います。

Sign in to comment.

More Answers (1)

Atsushi Ueno
Atsushi Ueno on 8 Sep 2021
Edited: Atsushi Ueno on 8 Sep 2021
関連する別質問の回答を踏まえ、やはりセル配列で処理すべきだと思います。質問文の例(S1.a, S1.b, S1.c)を複数のマットファイルについて纏める処理を書いてみましたが、 マットファイルの中に複数の構造体が入っていたり、構造体以外の型も処理しなければならないとなると、プログラムを書くのも大変になってきますね。
c = cell(0);
files = what; % 現在のフォルダ内のMATLABファイル一覧を取得
for matfile = files.mat' % 現在のフォルダ内のmatファイルについて繰り返す
if contains(matfile{:},'matfile') % matファイル選択(名前に'matfile'が付くmatファイル)
load(matfile{:}); % matファイルを読込(構造体S1が読み込まれる事を想定)
c = [c struct2cell(S1)]; % 構造体をセル配列に変換
%variables = who; % 現在のワークスペース内の変数一覧を取得
%eval(for vars = variables') % 書きかけ
% if isstruct(vars)
end
end
clear matfile;
clear files;
S1 = cell2struct(c, fieldnames(S1)); % S1のフィールド数不一致は想定していない
clear c;
save('matfile3.mat','S1');
あと、各要素は行列に纏めず、分けたままにしました。各要素を行列に纏めるのは本意でしょうか?たとえば下記文字列などは繋がってしまいますよ
['test1' ,'test2']
ans = 'test1test2'
  2 Comments
takeru misawa
takeru misawa on 9 Sep 2021
['test1' ,'test2'] に関しては本意ではございません。ご指摘いただきありがとう御座います

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!