@cccqwakk (航 鈴木)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

MATLABのテキストのデータ範囲の指定

MATLABで下記のようなテキストファイルを読み込み、内容を参照して範囲を読み、
y=1 の範囲のみのAの値での1×8の行列をMATLAB上に製作したいです。
下のURLのrange付近を参考に範囲の指定を行おうとしたのですが、テキスト内容を参照し範囲を指定する方法が分からず、
「ファイルからの行列の読み取り」
https://jp.mathworks.com/help/matlab/ref/readmatrix.html
opts.SelectedVariableNames など下記のURLを参考にした場合は、行範囲の指定方法が分からず困っています。
「ファイルの内容に基づくインポート オプションの作成」
https://jp.mathworks.com/help/matlab/ref/detectimportoptions.html
テキスト内の指定された関数での値を参照に範囲を決め、行列を製作する方法やその際のプログラムの例を教えていただけないでしょうか
image.png

0 likes

1Answer

一旦、行列として取り込んだ後に、添え字操作で取り出すのが良いと思います。
今回の例では、以下のような形で解決できるのではないでしょうか?

%% ファイルの読み込み
M = readmatrix(fileName);   % ファイルの行列形式読み込み
col_y = 2;                  % yは2列目
col_A = 3;                  % Aは3列目      
target_y = 1;               % y==1の行を抽出
result = M(M(:, col_y)==target_y, col_A);   % 指定の場所のみ取り出す

以下、コピペで実行可能なサンプルコードです。

test.m
%% サンプルファイルの作成
fileName = "table.txt";
A = 10*ones([24, 1]);
x = nan(size(A));
y = x;
for i = 1:3
    ind = (8*(i-1)+1):8*(i-1)+8;
    x(ind) = -4:3;
    y(ind) = i;
end
A(y==1)= 0;
A(y==1 & (0<=x&x<3)) = 3;

t = table(x, y, A);
fileID = fopen(fileName, 'w');
fprintf(fileID, "filename\nAAA\nBBB\n");
fprintf(fileID, "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n");
fprintf(fileID, "x  y A\n");
for i= 1:length(A)
    % fprintf("%+d %d %d\n", x(i), y(i), A(i));
    fprintf(fileID, "%+d %d %d\n", x(i), y(i), A(i));
end
fclose(fileID);

%% ファイルの読み込み
M = readmatrix(fileName);   % ファイルの行列形式読み込み
col_y = 2;                  % yは2列目
col_A = 3;                  % Aは3列目      
target_y = 1;               % y==1の行を抽出
result = M(M(:, col_y)==target_y, col_A);   % 指定の場所のみ取り出す

0Like

Your answer might help someone💌