2

次のようなスペースと奇妙な文字を含むいくつかのフィールド名を持つ、事前定義された大規模な Matlab 構造体を使用しています。

Pending Equity > T: [20000x1 double]

私はデータをうまく見ることができます:

>> r.('Pending Equity > T')(1)

ans =

     0

ただし、新しい値を割り当てることはできません:

>> r.('Pending Equity > T')(1) = 5
??? Invalid field name: 'Pending Equity > T'.

何か案は?元のフィールド名を変更できません。

4

4 に答える 4

1

From struct documentation:

Field name, specified as a string. Valid field names begin with a letter, and can contain letters, digits, and underscores. The maximum length of a field name is the value that the namelengthmax function returns.

so no spaces (nor ><!:;,etc), try using underscores instead of the spaces.

If you're sure you can read out the data just fine, then how was it constructed in the first place? As you can see from the above, such data structure are not supported.

于 2012-09-25T15:16:48.070 に答える
1

structのコピーですrが、有効なフィールド名を持つ新しい を作成できます。

names    = fieldnames(r);
newnames = genvarname(names);

for ii = 1:numel(names)
    new_r.(newnames{ii}) = r.(names{ii});
end

これにより、指定した方法ですべてのフィールドに物を割り当てることができます。

'Pending Equity > T'のようなフィールド名があまりきれいではない名前に変更されるという明らかな欠点があり'PendingEquity0x3ET'ます。

于 2012-09-25T19:39:23.933 に答える
0

試すことは2つ。

有効なデータ型に変換します。 と を使用fieldnamesstruct2cellて、そのセルから名前とすべてのデータ要素をポップアウトします。次に、そのリストでフィールド名を手動で検索して、セル配列のインデックスを取得できます。これらの両方をフィールドにラップし、任意のフィールド名を許可する構造体のように動作する小さなクラスを作成できます。これは、構造体を期待するほとんどのコードと互換性があります。または、参照渡しの動作と異なる構文を受け入れることができる場合は、これらを に貼り付けて、containers.Map任意の文字列をキーとして許可します。

または、MEX にドロップダウンしてgetfieldunsafe()、これらの偽の構造体で偽のフィールド名を使用できる独自のものを作成することもできます。呼び出しmxGetFieldて、偽のフィールド名で動作するかどうかを確認してください。そうでない場合は、MEX 関数で構造体のフィールド リスト内のフィールド名を手動で検索し、 を使用してデータを取得しますmxGetFieldByNumberhttp://www.mathworks.com/help/matlab/access-data.htmlを参照してください。

有効なオブジェクトに変換するのがおそらく最善です。問題が発生した場合はstruct2cellfieldnames変換のためだけに MEX をドロップダウンして、偽の構造体からデータを一度取得することができます。

于 2012-09-26T07:02:36.210 に答える
0

誰かがそのような構造体を作成できたことは非常に奇妙です。おそらくMatlabの古いバージョンですか?とにかく、頭に浮かぶのは機能だけsetfieldです。ただし、「無効なフィールド名」エラーも発生する可能性があります。

于 2012-09-25T15:22:15.020 に答える