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

50 visualizzazioni (ultimi 30 giorni)
Ochi Kai
Ochi Kai il 26 Ago 2022
Risposto: Ochi Kai il 2 Set 2022
例えばカレントディレクトリ内に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 Commento
Ochi Kai
Ochi Kai il 26 Ago 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行目を抜き取り、かつ要素数を合わせたいです。

Accedi per commentare.

Risposta accettata

Hernia Baby
Hernia Baby il 26 Ago 2022
■ディレクトリ内の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 Commenti
Ochi Kai
Ochi Kai il 31 Ago 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 il 31 Ago 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}
 これもとらえ方次第だと思いますが、celltable のままで処理できます。
 行を縦に結合させたい場合は以下のようにします
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

Accedi per commentare.

Più risposte (1)

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

Categorie

Scopri di più su 行列および配列 in Help Center e File Exchange

Tag

Community Treasure Hunt

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

Start Hunting!