行列からNaN値を削​除するにはどうしたら​よいですか?

조회 수: 147 (최근 30일)
MathWorks Support Team
MathWorks Support Team 2024년 11월 14일
답변: MathWorks Support Team 2024년 11월 14일

私の現時点のコードは以下の通りです。コードは最初の19行をスキップして20行目から開始するようにしています。しかし、例えば列が[10;0.04500;0;NaN;NaN]のようなデータからNaN値を削除する必要があります。NaNを削除するための行は実行されますが、実際には削除されません。何がうまくいっていないのかわかりません。この問題をどのように解決すればよいでしょうか?よろしくお願いします。

fid = fopen('filename.txt');
Rows = textscan(fid, '%s', 'delimiter', '\n');
fclose(fid);
Columns= cellfun(@(x) textscan(x,'%f','delimiter','\t','CollectOutput',1) ...
, Rows{1,1}(20:end, :));

fid(isnan(fid(:,1)),:) = [];

채택된 답변

MathWorks Support Team
MathWorks Support Team 2024년 11월 14일
コードにはいくつか修正が必要な問題があります。以下に改善点を示します。
  1. fopenの使用について:
    • fopenのドキュメントによると、fidは整数のファイル識別子であり、ファイルデータを含むものではなく、開かれたファイルへの参照に過ぎません。また、これはスカラー値です。そのため、fidをデータ配列のようにインデックスすることは意味がありません。
  2. テキストファイルの読み込み方法:
    • 現在の方法は複雑すぎます。最初にtextscanを実行し、その後cellfunで再びtextscanを呼び出すという方法は、ヘッダー行を避けるためだけに行われています。代わりに、textscanのドキュメントを参照し、HeaderLinesオプションを使用するべきです。例えば、以下のようにします。
    fid = fopen('filename.txt', 'r');
    data = textscan(fid, '%f', 'delimiter','\t', 'HeaderLines',20);
    fclose(fid);
    • CollectOutputオプションは、フォーマット指定子が1つだけの場合には不要です。同様に、デリミタも適切に指定する必要があります。複数の値が1行にある場合は、フォーマット指定子でそれらを指定する必要があります。ドキュメントには多くの例がありますので、参考にしてください。
  3. NaN値の削除方法:
    • R2018b以降では、rmmissing関数を使用して配列からNaN値を削除できます。例として以下をご覧ください。
    A = [1, NaN, 2];
    B = rmmissing(A);
    • 結果はベクトルB = [1 2]となります。
    • R2018a以前のバージョンでは、isnan関数を使用します。
    A = [1, NaN, 2];
    B = A(~isnan(A));
これにより、NaN値を効果的に削除できるはずです。

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Text Data Preparation에 대해 자세히 알아보기

태그

아직 태그를 입력하지 않았습니다.

제품


릴리스

R2016a

Community Treasure Hunt

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

Start Hunting!