読み取ったテキストフ​ァイル内の文字列に数​値を代入する

47 views (last 30 days)
wataru suzuki
wataru suzuki on 28 Sep 2020
Answered: wataru suzuki on 2 Oct 2020
解決したいこと
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
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ファイルを読み込んだ際、読み込んだデータのデータ型がどの様に影響するのか?を先ずは、インポート ツールを使用したテキスト ファイル データの読み取りを参考にしては如何でしょうか?読み込む方法や、対象データのデータ型によってどの様に読み取り結果が変化するのか?等を試して頂けると、ご理解頂けると思います。
wataru suzuki
wataru suzuki on 29 Sep 2020
ご回答ありがとうございます。
テキストファイルはstozaki様のイメージ図のような形です。
さっそく紹介していただいたインポートツールで読み込みのデータ型を変えて見た所、str配列の際はXと正しく
読み込めていますが、それ以外のデータ型ですとNaNに置き換わってしまっていました。
しかし、str配列は「'string' 型の値をインデックスとして使用できません」というエラーメッセージと計算が行われている箇所もエラーとなりました。
readcellを用いた場合、テキストから正しくXと読み込めたのですが、計算箇所で「'cell' 型の入力引数の演算子 '+' が未定義です。」などのエラーメッセージが出てしまいました。
私は現状の理解からXと正しく読み取れているreadcellを用い、行いたいのですがreadcellをこれからどう改善して言ったら良いか分からず困っています。この問題は数列に変換しないといけないかと推測していますが、こういった考えで近いでしょうか...なにかアドバイスをいただけると幸いです

Sign in to comment.

Accepted Answer

stozaki
stozaki on 29 Sep 2020
wataru suzuki様
返信頂きましてありがとうございます。
やりたいことを手順にしてみました。
  1. 上記の様な文字"X" と数値を含むテキストファイルを読み込む
  2. 文字 "X" を”数値10”に置き換える
  3. 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

More Answers (1)

wataru suzuki
wataru suzuki on 2 Oct 2020
stozaki 様
ご返信ありがとうございます。こちらからの返信が遅れ申し訳ありません
ご案内頂いた回答2より私のやりたい事が実現できました。誠にありがとうございます。

Community Treasure Hunt

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

Start Hunting!