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

17 views (last 30 days)
MathWorks Support Team
MathWorks Support Team on 14 Nov 2024 at 0:00
Answered: MathWorks Support Team on 14 Nov 2024 at 5:48

私の現時点のコードは以下の通りです。コードは最初の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)),:) = [];

Accepted Answer

MathWorks Support Team
MathWorks Support Team on 14 Nov 2024 at 0:00
コードにはいくつか修正が必要な問題があります。以下に改善点を示します。
  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値を効果的に削除できるはずです。

More Answers (0)

Categories

Find more on ビッグ データの処理 in Help Center and File Exchange

Tags

No tags entered yet.

Products


Release

R2016a

Community Treasure Hunt

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

Start Hunting!