指定のテキストファイルを生成する方法

11 次查看(过去 30 天)
osamu
osamu 2022-12-20
评论: osamu 2022-12-27
ある計測装置に取り込むデータ形式として,複素数を以下のように記述されたテキストファイルで生成する必要があります
(10,8)
(9,7)
(8,6)
この形式にmatlabで演算されたN×1複素配列を変換してテキストファイルで出力したいのですが、
特殊な文字列を含む形式で出力するはどうしたらいいでしょうか
強引に実部と虚部を分割したN×2の配列を作り、文字列に変換してからファイルを生成するよう組んでみましたが、そのままだとchr型となり、writematrixでテキスト保存すると余計な記号がついてしまいます。
Expdata=sprintf('(%s,%s)\n',data(:,1),data(:,2));
どのようにしたら希望の形式が作れますでしょうか。

采纳的回答

osamu
osamu 2022-12-23
お二人ともありがとうございます。
いろいろと検証していたのですが、どうもfprintfでそれぞれの結果をまとめる段階で実部,虚部という並びになっていないようなのですが、なぞそうなったのかがわかりません。
下は実部を1,虚部を2として実行してみた結果です。
% データの用意
N = 10;
X = ones(N,1);
data(1:N,1) = X;
data(1:N,2) = 2*X;
% データ書き込み
formatSpec = "(%d,%d)\n";
fileID = fopen("test1.txt","w"); % 出力ファイルオープン
fprintf(fileID,formatSpec,data(:,1),data(:,2));
fclose(fileID);
type("test1.txt");
(1,1)
(1,1)
(1,1)
(1,1)
(1,1)
(2,2)
(2,2)
(2,2)
(2,2)
(2,2)
  1 个评论
Hiro Yoshino
Hiro Yoshino 2022-12-23
すみません、fprintf のような低レベル水準関数だと一行ずつ for loop しないとだめですね。
仕切り直して:
N = 10;
X = rand(N,1,"like",1i+1)
X =
0.9154 + 0.9243i 0.0341 + 0.6117i 0.5942 + 0.3965i 0.0738 + 0.4764i 0.1970 + 0.3740i 0.0839 + 0.8642i 0.1147 + 0.6350i 0.2431 + 0.8951i 0.0952 + 0.7784i 0.8427 + 0.8234i
data(1:N,1) = real(X);
data(1:N,2) = imag(X);
data
data = 10×2
0.9154 0.9243 0.0341 0.6117 0.5942 0.3965 0.0738 0.4764 0.1970 0.3740 0.0839 0.8642 0.1147 0.6350 0.2431 0.8951 0.0952 0.7784 0.8427 0.8234
複数行で行う場合は@Akira Agataさんが示して下さった compose が良いですね:
C =compose("(%e, %e)",data(:,1),data(:,2))
C = 10×1 string array
"(9.154106e-01, 9.243007e-01)" "(3.409286e-02, 6.116904e-01)" "(5.942270e-01, 3.964775e-01)" "(7.384291e-02, 4.763674e-01)" "(1.969906e-01, 3.739939e-01)" "(8.386865e-02, 8.642191e-01)" "(1.147138e-01, 6.350207e-01)" "(2.430560e-01, 8.951343e-01)" "(9.516310e-02, 7.784384e-01)" "(8.427108e-01, 8.234494e-01)"
writelines(C,"test1.txt");
表示
type("test1.txt")
(9.154106e-01, 9.243007e-01) (3.409286e-02, 6.116904e-01) (5.942270e-01, 3.964775e-01) (7.384291e-02, 4.763674e-01) (1.969906e-01, 3.739939e-01) (8.386865e-02, 8.642191e-01) (1.147138e-01, 6.350207e-01) (2.430560e-01, 8.951343e-01) (9.516310e-02, 7.784384e-01) (8.427108e-01, 8.234494e-01)
という感じで良いかと思います。

请先登录,再进行评论。

更多回答(2 个)

Hiro Yoshino
Hiro Yoshino 2022-12-20
ひょっとしたらもう少しスマートな方法が有るかも知れませんが....
% データの用意
N = 10;
X = rand(N,1,"like",1i+1);
data(1:N,1) = real(X);
data(1:N,2) = imag(X)
data = 10×2
0.2797 0.3117 0.7102 0.6884 0.2867 0.7430 0.6207 0.1206 0.5966 0.7333 0.4319 0.0527 0.9783 0.2129 0.6727 0.2216 0.5665 0.2075 0.9452 0.0006
% データ書き込み
formatSpec = "(%s,%s)\n";
fileID = fopen("test1.txt","w"); % 出力ファイルオープン
fprintf(fileID,formatSpec,data(:,1),data(:,2));
fclose(fileID);
type("test1.txt");
(2.797037e-01,7.101982e-01) (2.867208e-01,6.207492e-01) (5.966407e-01,4.318941e-01) (9.782568e-01,6.727409e-01) (5.664620e-01,9.452370e-01) (3.116674e-01,6.883858e-01) (7.429645e-01,1.205636e-01) (7.333456e-01,5.272098e-02) (2.129227e-01,2.215730e-01) (2.075361e-01,6.287421e-04)
こんな感じでどうでしょうか?
  1 个评论
Akira Agata
Akira Agata 2022-12-21
编辑:Akira Agata 2022-12-21
+1
composewritelines を使っても同じことができます。
% データの用意
N = 10;
X = rand(N, 1, "like", 1i+1);
% 書き込みたい文字列形式に変換
C = compose("(%e, %e)", real(X), imag(X));
% テキストファイルとして出力
writelines(C, "test2.txt")

请先登录,再进行评论。


osamu
osamu 2022-12-26
ご返信ありがとうございます。
writelines関数が動作しなかったため調べてみたのですが、当方の環境2021aでは2022aより実装のwritelines関数は使えないようでした。
質問のとおりwritematrixなどの出力関数ではダブルクォーテーションマークなど記述形式が限定されていますので、現環境では@Hiro Yoshino様がコメントされたfprintfをループ関数で回す方法しかないのかもしれません…。
  2 个评论
Hiro Yoshino
Hiro Yoshino 2022-12-26
编辑:Hiro Yoshino 2022-12-26
訂正します。こんな風にすれば良いかと:
N = 10;
X = rand(N,1,"like",1i+1);
data(1:N,1) = real(X);
data(1:N,2) = imag(X);
data
data = 10×2
0.3739 0.2092 0.4644 0.0841 0.5628 0.5548 0.5082 0.0280 0.1743 0.7743 0.2142 0.1138 0.8427 0.1187 0.2465 0.6259 0.9038 0.7363 0.9088 0.7834
C =compose("(%e, %e)",data(:,1),data(:,2))
C = 10×1 string array
"(3.739472e-01, 2.091950e-01)" "(4.644203e-01, 8.408751e-02)" "(5.628343e-01, 5.547554e-01)" "(5.082131e-01, 2.799395e-02)" "(1.743209e-01, 7.743217e-01)" "(2.142454e-01, 1.138472e-01)" "(8.426814e-01, 1.186955e-01)" "(2.464870e-01, 6.259309e-01)" "(9.037843e-01, 7.362560e-01)" "(9.087814e-01, 7.833640e-01)"
% ファイル書き出し
fileID = fopen("test1.txt","w");
fprintf(fileID,"%s\n",C);
fclose(fileID);
% ファイルの中身表示
type("test1.txt")
(3.739472e-01, 2.091950e-01) (4.644203e-01, 8.408751e-02) (5.628343e-01, 5.547554e-01) (5.082131e-01, 2.799395e-02) (1.743209e-01, 7.743217e-01) (2.142454e-01, 1.138472e-01) (8.426814e-01, 1.186955e-01) (2.464870e-01, 6.259309e-01) (9.037843e-01, 7.362560e-01) (9.087814e-01, 7.833640e-01)
fprintf は行列も引数に取ることができるので、一発でいけます。
osamu
osamu 2022-12-27
できました!
ありがとうございます。

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 文字と文字列 的更多信息

产品


版本

R2021a

Community Treasure Hunt

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

Start Hunting!