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

19 visualizaciones (últimos 30 días)
MathWorks Support Team
MathWorks Support Team el 14 de Nov. de 2024 a las 0:00
Respondida: MathWorks Support Team el 14 de Nov. de 2024 a las 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)),:) = [];

Respuesta aceptada

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

Más respuestas (0)

Categorías

Más información sobre ビッグ データの処理 en Help Center y File Exchange.

Etiquetas

Aún no se han introducido etiquetas.

Productos


Versión

R2016a

Community Treasure Hunt

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

Start Hunting!