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

17 visualizzazioni (ultimi 30 giorni)
MathWorks Support Team
MathWorks Support Team il 14 Nov 2024 alle 0:00
Risposto: MathWorks Support Team il 14 Nov 2024 alle 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)),:) = [];

Risposta accettata

MathWorks Support Team
MathWorks Support Team il 14 Nov 2024 alle 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値を効果的に削除できるはずです。

Più risposte (0)

Categorie

Scopri di più su ビッグ データの処理 in Help Center e File Exchange

Tag

Non è stata ancora inserito alcun tag.

Prodotti


Release

R2016a

Community Treasure Hunt

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

Start Hunting!