6

私がフィールドとSを備えたサイズ0x1の構造体を持っていると仮定すると、それにフィールドを追加する最もエレガントな方法は何ですか?abc

通常、私は次のようにそれを行うことができます:

S = struct('a',0,'b',0); %1x1 struct with fields a,b
S.c = 0

ただし、空の構造体を受け取った場合、これは機能しなくなります。

S = struct('a',0,'b',0);
S(1) = []; % 0x1 struct with fields a,b
S.c = 0;
% A dot name structure assignment is illegal when the structure is empty.  
% Use a subscript on the structure.

私はこれに対処するための2つの方法を考えましたが、どちらも非常に醜く、解決策というよりは回避策のように感じます。(空でない構造体の可能性も適切に処理する必要があることに注意してください)。

  1. 構造体に何かを追加して空でないことを確認し、フィールドを追加して、構造体を再び空にします
  2. 必要なフィールド名を使用して新しい構造体を初期化し、元の構造体のデータを入力して、元の構造体を上書きします

空の構造体を気にするのは奇妙かもしれませんが、残念ながら、フィールド名が存在しない場合、私が管理していないコードの一部がクラッシュします。を確認しhelp structhelp subsasgn指定されたエラーメッセージも検索しましたが、これまでのところヒントは見つかりませんでした。したがって、助けていただければ幸いです。

4

4 に答える 4

7

dealこの問題を解決するために使用できます。

S = struct('a',0,'b',0);
S(1) = [];

[S(:).c] = deal(0);

これにより、

S = 

1x0 struct array with fields:
    a
    b
    c 

これは、空でない構造体でも機能します。

S = struct('a',0,'b',0);

[S(:).c] = deal(0);

その結果、

S = 

    a: 0
    b: 0
    c: 0
于 2013-02-12T14:47:48.270 に答える
2

どうですか

S = struct('a', {}, 'b', {}, 'c', {} );

空の構造体を作成するには?

別の方法は、発生したエラーの回避策としてfilewithをmex使用することです。mxAddField

構造体が空の場合、ドット名構造体の割り当ては無効です。
構造に添え字を使用します。

于 2013-02-12T10:33:21.490 に答える
2

setfield問題を解決するために使用できます。

S = struct('a', {}, 'b', {});
S = setfield(S, {}, 'c', [])

これにより、

S = 

0x0 struct array with fields:
    a
    b
    c
于 2015-06-27T08:03:20.177 に答える
1

@Shaiの答えを拡張するために、使用できる単純なMEX関数を次に示します。

addfield.c

#include "mex.h"

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
    char *fieldname;

    /* Check for proper number of input and output arguments */
    if (nrhs != 2) {
        mexErrMsgIdAndTxt("struct:nrhs", "Two inputs required.");
    } else if (nlhs > 1) {
        mexErrMsgIdAndTxt("struct:nlhs", "Too many output arguments.");
    } else if (!mxIsStruct(prhs[0])) {
        mexErrMsgIdAndTxt("struct:wrongType", "First input must be a structure.");
    } else if (!mxIsChar(prhs[1]) || mxGetM(prhs[1])!=1) {
        mexErrMsgIdAndTxt("struct:wrongType", "Second input must be a string.");
    }

    /* copy structure for output */
    plhs[0] = mxDuplicateArray(prhs[0]);

    /* add field to structure */
    fieldname = mxArrayToString(prhs[1]);
    mxAddField(plhs[0], fieldname);
    mxFree(fieldname);
}

例:

>> S = struct('a',{});
>> S = addfield(S, 'b')
S = 
0x0 struct array with fields:
    a
    b
于 2013-05-02T18:06:37.780 に答える