2

そのため、使用されるデータを含むいくつかの構造体があり、1ダースほどのスクリプトです。問題は、スクリプトごとにほんの一握りの変数しか必要なく、残りは無視できることです。大量のデータ (データのギグ) を使用しており、MATLAB でメモリ不足エラーが頻繁に発生するため、構造体から不要なフィールドをすべて削除する必要があります。

現在、不要なフィールドをすべて含むセルがあり、構造体で rmfield を呼び出しています。しかし、構造体のフィールドは頻繁に変更されるため、不要なフィールドのリストを常に更新するのは面倒です。では、MATLAB に、必要なフィールドのみを保持し、他のすべてが何であるかがわからない場合でも、他のすべてを削除するように指示する方法はありますか?

ここに例があります、

  • 構造体 1 には、A、B、C、D、E フィールドがあります。
  • 構造体 2 には、A、B、C、D、E、F フィールドがあります。
  • 構造体 3 には、A、B、C、D、E、F、G、H、I フィールドがあります。

構造体 3 に A から G しかない場合もあります。

A、B、および C フィールドのみを保持し、すべての構造体から他のすべてのデータを削除したいと考えています。

4

5 に答える 5

6

これを行う1つの方法は次のとおりです。

  1. を使用してすべてのフィールド名のリストを取得しますfieldnames
  2. リストから残したいものを削除する
  3. リストに残っているものをすべて削除します

s.a=1
s.b=2
s.c=3
s.d='chitchat'

tokeep = {'a','b'}

f=fieldnames(s)

toRemove = f(~ismember(f,tokeep));

s = rmfield(s,[toRemove])
于 2013-02-01T14:39:41.480 に答える
1

構造体の必要なフィールドを関数の新しい変数にコピーできます。

function newVar = getABC(strct)
    newVar.A = strct.A;
    newVar.B = strct.B;
    newVar.C = strct.C;        
end

strct操作しないため、メモリにコピーされません。

MATLAB は、一般に "copy-on-write" と呼ばれるシステムを使用して、入力引数を変更するまで、または変更しない限り、関数ワークスペース内で入力引数のコピーを作成しないようにします。入力引数を変更しない場合、MATLAB はコピーの作成を回避します。

メモリから取得newVarして取得できます。clear strct


フレッドの一般化されたバージョン:

function newVar = getFields(oldVar, desiredCell)
    for idx = 1:length(desiredCell)
    newVar.(desiredCell{idx}) = oldVar.(desiredCell{idx});
end
于 2013-02-01T14:42:24.223 に答える
0

1)あなたが構造Sを持っているとしましょう

2) S の最初の 3 つのフィールドのみを保持し、他のすべてのフィールドを削除したい

fieldsS = fieldnames(S);
S = rmfield(S,fieldsS(4:end));
于 2014-05-21T13:07:44.380 に答える