読み取ったテキストファイル内の文字列に数値を代入する
45 views (last 30 days)
Show older comments
解決したいこと
MATLABでテキスト内の行列マトリクスを読み取り、行列内に含まれる文字Xの値に10という数値を入れたいです。
記述ソースコード①
①はfor文内にXの数値を入れれば認識するかとプログラミングしました。
p = readmatrix('xyA_8.txt', 'NumHeaderLines', 5);
%行列のサイズの指定、0の空欄を作る
q = zeros(3,3);
%1~合計ピクセルまでfor文で回す
for i = 1:9
q(p(i,2)+1,p(i,1)+1) = p(i,3);
X = str2double('10')
end
disp(q);
①の結果と課題
45 45 45
45 NaN 45
45 45 45
①の場合、行列内のXに数値が入っていませんでした。記述ソースコード②
②はテキスト検索を用い、糸口がつかめるかとプログラミングしました。
%行列の読み取り=readmatrix
%~行目から読み取り=NumHeaderLines
p = readmatrix('xyA_8.txt', 'NumHeaderLines', 5);
%行列のサイズの指定、0の空欄を作る
q = zeros(3,3);
%1~合計ピクセルまでfor文で回す
for i = 1:9
q(p(i,2)+1,p(i,1)+1) = p(i,3);
end
%qの表示
disp(q);
idx = strfind(str,'X')
idx{:,:}
②の結果と課題
45 45 45
45 NaN 45
45 45 45
エラー: strfind
入力の文字列は、1 行でなければなりません。
エラー: colormap10 (line 28)
idx = strfind(str,'X')
こちらでも上手くいきませんでした。お聞きしたいこと
何故これらの場合は上手くいかないのか、目標とするテキスト内を読み込み、その中に存在する文字に対し、数値を代入し行列を完成する為のプログラムや手段をどうしたらよいか教えていただけると幸いです。
2 Comments
stozaki
on 28 Sep 2020
Edited: stozaki
on 28 Sep 2020
wataru suzuki 様
テキストファイルには、数値と文字列Xが含まれているという認識でよろしいでしょうか?
例えば、次のように。
1 2 3
4 X 6
7 8 9
このままですと、異なるデータ型が混在しているデータを読み込もうとしており、Xが数値としてみなされるので、NaNと置き換わってしまっています。
readmatrixを使うのであれば、オプション引数を設定するか、readlcellを使って一旦セルとして読み込むか等の前処理が必要かと思います。
.txtファイルを読み込んだ際、読み込んだデータのデータ型がどの様に影響するのか?を先ずは、インポート ツールを使用したテキスト ファイル データの読み取りを参考にしては如何でしょうか?読み込む方法や、対象データのデータ型によってどの様に読み取り結果が変化するのか?等を試して頂けると、ご理解頂けると思います。
Accepted Answer
stozaki
on 29 Sep 2020
wataru suzuki様
返信頂きましてありがとうございます。
やりたいことを手順にしてみました。
- 上記の様な文字"X" と数値を含むテキストファイルを読み込む
- 文字 "X" を”数値10”に置き換える
- N*M (例では3*3) の数値行列として変数に格納して数値計算に使用できるようにする
例として次のような文字が含まれる.txtファイルを想定して回答いたします。
X 2 3
4 X 6
7 8 9
幾つか処理方法が考えられますが、2つほど回答例を示します。
お試し頂いたようにインポートツールを使うと、手順1~3がGUI操作で出来てしまいます。
出力タイプを数値行列として、置き換えの値を数値10とし、スクリプトを生成してしまえば所望の処理が記載されたスクリプトが生成されます。(勿論関数として出力してもOKです)
回答2. 読み込んだデータのデータ型を意識してプログラムを作成する
% 手順1 テキストファイルをセル配列として読み込む
% 数値は{[1]}、文字列は{'X'}のように読み込みます
ret = readcell('sample.txt');
% 手順2 文字"X" のインデックスを探す
tmp = find(strcmp('X', ret));
% 手順2つづき 文字'X'を数値10として置き換えます。
% ただし、手順1でセル配列として読み込んでいるので、置き換える値10はセル配列として置き換えます
ret(tmp) = num2cell(10);
% 手順3 セル配列を数値行列へ変換します : myMatrixが欲しい数値行列
myMatrix = cell2mat(ret);
今回はreadcellを使いましたが、他のデータ読み込み用の関数でも、以下の様なデータ型の変換関数さえ上手く処理できれば対応は可能かと思います。
行列の要素数の拡張、検索文字列の変更、数値を文字列として設定('10'のように) して色々とお試し頂けると幸いです。
stozaki
0 Comments
More Answers (1)
See Also
Categories
Find more on テキスト ファイル in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!