異なる行数(列数)の行列の書き出し方法について(txt, csvなど)
5 views (last 30 days)
Show older comments
takeru misawa
on 7 Sep 2021
Commented: takeru misawa
on 9 Sep 2021
変数 a = 1, b=2 c =3
行列 d= (1 ,2 ,3, 4,5) e= (0.1 ,0.2 ,0.3 ,0.4, 0.5, 0.6)
※dは1*5 , eは1*6の行列
の5つがあった場合、添付ファイルのようなものを作成するのにはどうすればよいでしょうか。
0 Comments
Accepted Answer
Hernia Baby
on 7 Sep 2021
Edited: Hernia Baby
on 7 Sep 2021
構造体でまずは変数を定義します
A.a = 1;
A.b = 2;
A.c = 3;
A.d = 1:5;
A.e = A.d*0.1;
cell型に変換していきます
そのあと構造体をcell型に変換します
A = structfun(@num2cell,A,"UniformOutput",false);
B = struct2cell(A);
空白を表現したいのですがここではNaNで空白部分を埋めています
maxLength = max(cellfun(@numel,B));
result = cellfun( @(x) [cell2mat(x), NaN(1,maxLength-numel(x))], B, 'UniformOutput', false);
result = num2cell(vertcat(result{:}));
変数名を連結させます
name = fieldnames(A);
C = [name, result];
NaNを空白に変更します
mask = cellfun(@(x) all(isnan(x)), C);
C(mask) = {''}
最後に書き出します
writecell(C,"Output.csv");
3 Comments
Hernia Baby
on 8 Sep 2021
Edited: Hernia Baby
on 8 Sep 2021
■上手くいかない理由
データ型が違うので処理ができない部分があります
result = cellfun( @(x) [cell2mat(x), NaN(1,maxLength-numel(x))], B, 'UniformOutput', false);
cell2mat が cell型をdouble型に変換しています
ここで文字が入るとうまくいきません
■対処法
すべてstring型としてcellに格納します
A.a = 'a';
A.b = 2;
A.c = 3;
A.d = 1:5;
A.e = A.d*0.1;
A = structfun(@num2cell,A,"UniformOutput",false);
B = struct2cell(A);
maxLength = max(cellfun(@numel,B));
% result = cellfun( @(x) [cell2mat(x), NaN(1,maxLength-numel(x))], B, 'UniformOutput', false);
result = cellfun( @(x) [string(x), NaN(1,maxLength-numel(x))], B, 'UniformOutput', false);
result = num2cell(vertcat(result{:}));
name = fieldnames(A);
C = [name, result];
mask = cellfun(@(x) all(ismissing(x)), C);
C(mask) = {''}
More Answers (0)
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!