Effacer les filtres
Effacer les filtres

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

16 vues (au cours des 30 derniers jours)
Ochi Kai
Ochi Kai le 26 Août 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 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
■ディレクトリ内の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
後すいません。。。重ねての質問なのですが、途中までで
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}
 これもとらえ方次第だと思いますが、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

Connectez-vous pour commenter.

Plus de réponses (1)

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

Catégories

En savoir plus sur 行列および配列 dans Help Center et File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!