CSVデータで指定した列数だけ行数を切り取り、正方形のデータとして抽出したい
51 views (last 30 days)
Show older comments
Inagaki takeshi
on 12 May 2021
Commented: Inagaki takeshi
on 28 May 2021
音声データ(wav)をCSVに変換、そのCSVファイルをこちらで指定した行数で列数を切り分けたデータ(いわば正方形)を量産したいと考えています。
(例:257行、5000列のcsvデータに対し、こちらで0行から100行指定。→0からの100行×100列を5000列まで、新たなcsvとして切り分け保存するループのようなもの)
音声データをcsvファイルに変換することはできたのですが、そこからの分割が手も足も出ないです。
読み込み→指定して切り分け、保存→ループ→終了の流れはなんとなく掴めてはいるのですが。。。
どのような関数を使い組み立てていけばよいのでしょうか、ご教授願いたいです。
0 Comments
Accepted Answer
Kojiro Saito
on 12 May 2021
reshapeを使えば簡単にできそうです。
以下のようなサンプルでどうでしょうか?
t = readmatrix('data.csv');
numLines = 1:100;
n = size(numLines,2);
rt = reshape(t(numLines,:), n, n, []);
for n=1:size(rt,3)
filename = sprintf('data%d.csv', n);
writematrix(rt(:, :, n), filename)
end
5 Comments
Atsushi Ueno
on 27 May 2021
ファイル名の事を考えていませんでした。filenameを変えればやりたい事は出来ます。但し重ね合わせ量の変更には対応していません。コメントにて追加された要件を統合すると、私の変更対応は場当たり的過ぎます。切り出す所から変更した方が良さそうですね。やります。
for n=1:size(rt,3) % 切り出した行列を半分ずつ重ね合わせてcsvファイルに出力する
filename = sprintf('data%d.csv', 2*n-1); % ファイル番号を2n-1にする
writematrix(rt(:, :, n), filename);
if(n < size(rt,3)) %最後の端でなかったらn枚目の後半とn+1枚目の前半を出力する
filename = sprintf('data%d.csv', 2*n); % 重なる部分はファイル番号を2nにする
writematrix([rt(:, 51:100, n) rt(:, 1:50, n+1)], filename);
end
end
More Answers (1)
Atsushi Ueno
on 27 May 2021
前回答のコメントで追加された要件への対応です。末端の処理は「余るデータを切り捨て」ではなく「データ数不足でも保存」に変更しました。while文ループなのでreshape関数に比べると処理が遅いです。
function k = moving_window_data2csv(n, m)
% CSVファイルの数値データをmoving windowで走査し別CSVファイルに保存する
% 引数: n:指定抽出行数(=指定抽出列数)
% 引数: m:指定移動列数
% データ先頭から指定抽出行数×指定抽出列数を抽出する
% 行方向の指定抽出行数以降のデータは抽出不要(逆に行数不足でも抽出する)
% 列方向は指定移動列数ずつずらしながら列の最後まで抽出していく
% 抽出した指定抽出行数×指定抽出列数のデータは各々異なるCSVファイルに保存する
% 指定抽出行数×指定抽出列数未満のデータ数があれば最後のCSVファイルに保存する
k = 0; % ファイル名用カウンタ
t = readmatrix('data.csv'); %csvファイルの素性が決定されていれば、最初のn行のみ読み出すべき
t = t(1:min(n,size(t,1)), :); % 速度向上の為、頭から指定抽出行数のみまとめて抽出
while ~isempty(t)
k = k + 1;
writematrix(t(:, 1:min(n,size(t,2))), ['data' num2str(k) '.csv']);
if n^2 >= numel(t), break; end % 残りデータ数が全て抽出済なら終了
t(:, 1:min(m,size(t,2))) = []; % データ先頭から指定移動列数を削除する
end
end
手持ちのmatlabが古くreadmatrix,writematrix関数を直接動確できませんでした。
作りながら、これは音声フィルタ処理の為の前処理”Moving Window”である事に気付きました。MATLABにも"moving window"を動かして何らかの演算を行う関数が多数あります(下記参照)。コメントにあった末端の処理方法(データを切り捨てるかゼロ埋めするか等)も選択肢を持っています。しかし、moving windowが捉えたデータそのものを出力する機能はいずれの関数にもありません。もしかするとMoving Window機能単体が動作するMATLAB関数が何かあるかもしれません。
- デジタルフィルタ(filter, filter2関数)
- 畳み込み演算(conv, conv2関数)
- 移動平均等の演算(movsum, movprod関数など)
3 Comments
Atsushi Ueno
on 27 May 2021
moving window機能(slide function)単体の関数 slidefun - File Exchange - MATLAB Central (mathworks.com)
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!