4

ベクトル/変数名を保持したまま、.matファイルをcsvに変換しようとしています。これは私が扱っているものの一例です:

mymat =

       model_id: [2217x1 double]
    own_dummies: [2217x26 double]
             id: [2217x1 double]
        product: [2217x1 double]
          const: [2217x1 double]
            mpd: [2217x1 double]
            air: [2217x1 double]
            mpg: [2217x1 double]
          trend: [2217x1 double]
          space: [2217x1 double]
           hpwt: [2217x1 double]
        cdindex: [20x1 double]
           cdid: [2217x1 double]
         outshr: [2217x1 double]
         firmid: [2217x1 double]
          share: [2217x1 double]
          price: [2217x1 double]

使用してみましcsvwrite('test.csv', mymat)たが、エラーが発生します。

??? Undefined function or method 'real' for input arguments of type 'struct'.
Error in ==> dlmwrite at 192
                str = sprintf('%.*g%+.*gi',precn,real(m(i,j)),precn,imag(m(i,j)));\
Error in ==> csvwrite at 32
dlmwrite(filename, m, ',', r, c);

問題は、マトリックスではなく構造体を使用してcsvwriteにフィードしていることだと思います。構造体変数を変数から行列に変換することはできますが、変数名を失うことになります。

確かにもっと良い方法がありますか?

4

1 に答える 1

2

構造体を実際にどのようにcsvにマッピングしますか?行列の次元に互換性がないため、最初の行のエントリとしてフィールド名の単純なマップを作成することはできません。したがって、この例では、1。own_dummiesにいくつかの列を導入し、2。cdindexを展開する必要があります。

したがって、ラッパーを記述して、行列自体に互換性を持たせ、列を自分でファイルに書き込むことができます。の(テストされていない、概念的な)線に沿った何か

    function saveData(filename, data, type)

    % at first bring struct data to sensible format
    if strcmp(type)='my_mat_type'
        data.own_dummies2 = data.own_dummies[2,:]; % split into seperate columns
        %...
        data.own_dummies26 = data.own_dummies[26,:];
        data.own_dummies = data.own_dummies[1,:];
        data.cdindex = [data.cdindex -ones(1,2217-length(data.cdindex)]; % pad any missing values as -1
    end;


    FD = fopen(filename, 'w');

    %todo did it open?

    fields = fieldnames(data);
    nfields = length(fields);

    % create column name values
    columns = strcat(strcat(fields,',')); % creates string = col1,col2,...coln,
    columns = columns(1:length(columns)-1); %remove trailing comma

    CRNL = char([10 13]); % or so

    % print columns and newline
    fprintf(FD,strcat(columns,CRNL)); 

    dataout = cell2mat(struct2cell(data));

    % use your method to write the data to the file

    fclose(FD);

もちろん、個々のフィールドを個別のファイルに分割して、フィールド名がファイル名に含まれている場合もあります。これは、一般的に言えば、より単純な場合があります。

于 2013-01-20T10:35:35.073 に答える