csvファイルを全て読み込み、配列を合わせる

例えばカレントディレクトリ内に3つのcsvファイルA.csv、B.csv、C.csvがあり、
A = [1 2 3]、B=[2 4 6 8 10]、C=[1 3 5 7 9 11]等のようにそれぞれ違う配列数のデータがあるとします。(行数は同じだが、列数が異なる)
これら全てを読み込み、なおかつ
A = [1 2 3]、B=[2 4 6 ]、C=[1 3 5 ]のように要素数を最小のものに合わせる様にはどのようにすればよろしいでしょうか?よろしくお願いいたします。

1 commentaire

Ochi Kai
Ochi Kai le 26 Août 2022
すいません、少し条件を変更させてください。。。
A = [0 0 0, 1 2 3]、B=[0 0 0 0 0 , 2 4 6 8 10]、C=[0 0 0 0 0 0, 1 3 5 7 9 11]を
A = [1 2 3]、B=[2 4 6 ]、C=[1 3 5 ]のように
2行目を抜き取り、かつ要素数を合わせたいです。

Connectez-vous pour commenter.

 Réponse acceptée

Hernia Baby
Hernia Baby le 26 Août 2022

1 vote

■ディレクトリ内のcsvを一気に読み込みます
files = dir('*.csv');
for ii = 1:length(files)
X{ii} = readmatrix(files(ii).name);
end
■読み込んだデータは以下のようになっています
A = [0 0 0; 1 2 3]';
B = [0 0 0 0 0; 2 4 6 8 10]';
C = [0 0 0 0 0 0; 1 3 5 7 9 11]';
X = {A,B,C}
X = 1×3 cell array
{3×2 double} {5×2 double} {6×2 double}
■cell型なのでcellfunを使ってまとめて処理していきましょう
・まずは2行目だけを抜き取ります
X = cellfun(@(x) x(:,2),X,'UniformOutput',false)
X = 1×3 cell array
{3×1 double} {5×1 double} {6×1 double}
・次に最小のサイズを調べます
sz = min(cellfun(@height,X))
sz = 3
・最後にサイズを揃えます
X = cellfun(@(x) x(1:sz,1),X,'UniformOutput',false)
X = 1×3 cell array
{3×1 double} {3×1 double} {3×1 double}
・もし連結させたい場合はcell2matで合体させます
X = cell2mat(X)
X = 3×3
1 2 1 2 4 3 3 6 5

5 commentaires

Ochi Kai
Ochi Kai le 31 Août 2022
私用により連絡が遅れてしまい申し訳ございません。
ご回答ありがとうございます。ご教授いただいたことを参考に進めていくと、上手くできました。
1つだけ質問させていただきたいのですが、
X = 3×3
1 2 1
2 4 3
3 6 5
となった後に、X1=[1 2 3]',X2=[2 4 6]',X3=[1 3 5]'と分けて、それぞれワークスペースに表示する方法もおしえていただけないでしょうか?
Hernia Baby
Hernia Baby le 31 Août 2022
cell型ではなく、変数をそれぞれ作ってワークスペースに格納したいという認識でしょうか?同様の操作をまとめて行えなくなるのであまりお勧めできませんが…
Ochi Kai
Ochi Kai le 31 Août 2022
そうですね。その認識で合っております。お勧めできないということですが、一応教えていただけますでしょうか?
Ochi Kai
Ochi Kai le 31 Août 2022
後すいません。。。重ねての質問なのですが、途中までで
X = 1×3 cell array
{3×1 double} {3×1 double} {3×1 double}
となっており、
X = cell2mat(X)
でX = 3×3と処理していますが、例えば
{1×3 double} {1×3 double} {1×3 double}
をX = 3×3とするにはどうすればよいでしょうか?
X = cell2mat(X) を使うとX = 1×9となってしまい困っています
Hernia Baby
Hernia Baby le 31 Août 2022
ひとつずつ答えますね。
まずはデータを用意します。
A = [0 0 0; 1 2 3]';
B = [0 0 0 0 0; 2 4 6 8 10]';
C = [0 0 0 0 0 0; 1 3 5 7 9 11]';
X = {A,B,C};
X = cellfun(@(x) x(:,2),X,'UniformOutput',false);
sz = min(cellfun(@height,X));
X = cellfun(@(x) x(1:sz,1),X,'UniformOutput',false);
X0 = cell2mat(X);
■各変数の作り方
for ii = 1:length(X)
eval(sprintf('X%i = X{%i};',ii,ii))
end
who
Your variables are: A B C X X0 X1 X2 X3 cmdout ii sz
X1, X2, X3ができました。
■なぜ各変数にするとよくないか
 計算が一度にできないからです。
 例として、平均をとりたいとなったとしましょう。
・X : cellでそれぞれ格納した場合
cellfun(@mean,X)
ans = 1×3
2 4 3
・X0 : 行列の場合
mean(X0)
ans = 1×3
2 4 3
・X1, X2, X3 : 各変数の場合
mean([X1,X2,X3])
ans = 1×3
2 4 3
 上記のように変数を手動で増やしていかなければいけません。
 そのためコードを逐一変える必要があるのでお勧めできないのです。
■{1×3 double} {1×3 double} {1×3 double}
 これもとらえ方次第だと思いますが、cell や table のままで処理できます。
 行を縦に結合させたい場合は以下のようにします
Xt = cellfun(@transpose,X,'UniformOutput',false)
Xt = 1×3 cell array
{[1 2 3]} {[2 4 6]} {[1 3 5]}
①要素ごとに結合
Xtt = [];
for ii = 1:length(X)
Xtt = [Xtt;Xt{ii}]
end
Xtt = 1×3
1 2 3
Xtt = 2×3
1 2 3 2 4 6
Xtt = 3×3
1 2 3 2 4 6 1 3 5
②cellfun×transposeを使う
 Xtと同じことをします
cell2mat(cellfun(@transpose,Xt,'UniformOutput',false))'
ans = 3×3
1 2 3 2 4 6 1 3 5

Connectez-vous pour commenter.

Plus de réponses (1)

Ochi Kai
Ochi Kai le 2 Sep 2022

0 votes

とても丁寧に教えてくださり本当にありがとうございます。(´;ω;`)
またMATLAB環境を使える時が限られておりお返事が遅くなり申し訳ございませんでした。
この度は本当にありがとうございます。

Catégories

En savoir plus sur 数学 dans Centre d'aide et File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!