3

私は 1xn 構造体を持っています。構造体には、数値セルを含むいくつかのフィールドが含まれています。すべての構造体に同じフィールドがあるわけではありません。そこで、欠落しているフィールドを構造体に追加したいと思います。しかし、私はそれを取得しませんでした。

%  Mimimal example
%  I have same cells, imported from csv by csv2cell()

clear

dataCell{1}={"field_a","field_b","field_c"; ...
    1,2,3; ...
    4,5,6};

dataCell{2}={"field_a","field_b","field_d"; ...
    1,2,4; ...
    4,5,8};

%   Then I convert them to a struct
for ii=1:numel(dataCell)    
DataStruct{ii}=cell2struct((dataCell{ii}(2:end,:)),[dataCell{ii}(1,:)],2);
  try fields=[fields, fieldnames(DataStruct{ii})']; % fails for the first loop, because 'fields' doesn't exist yet
  catch
   fields=[fieldnames(DataStruct{ii})']; % create 'fields' in the first loop
  end
end

% Create a list of all existing fields
fields=unique(fields);

% Now look for the missing fields and add them to the struct
for jj=1:numel(DataStruct)
  missing_fields{jj} = setdiff(fields,fieldnames(DataStruct{jj}));
  for kk=1:numel(missing_fields)
    DataStruct{jj}.(missing_fields{jj}{kk})=NaN*zeros(numel(dataCell{jj}(2:end,1)),1); % Execution fails here!
  end
end

これにより、エラーが発生します。

オクターブエラー

error: invalid assignment to cs-list outside multiple assignment
error: called from:
error:   ~/example.m at line 29, column 44

Matlab エラー

Insufficient outputs from right hand side to satisfy comma separated
list expansion on left hand side.  Missing [] are the most likely cause.

問題は、の出力がDataStruct{1}.field_a行列やセルではなく、複数の ans であることです。セルをマトリックスに変換する簡単な可能性や、csv をインポートするより良い可能性はありますか?

他の良い可能性は次のようなものです

 DataStruct{jj}=setfields(missing_fields{jj},NaN_Values{jj})

ここでmissing_fields{jj}、 とNaN_Valuesは両方とも同じ長さのセルであるため、一度に複数のフィールドを設定できます。

4

2 に答える 2

2

関数を使用して、deal出力を入力に分配します。あなたの例:

% Now look for the missing fields and add them to the struct
for jj=1:numel(DataStruct)
  missing_fields{jj} = setdiff(fields,fieldnames(DataStruct{jj}));
  for kk=1:numel(missing_fields)
    [DataStruct{jj}.(missing_fields{jj}{kk})] = deal(NaN*zeros(numel(dataCell{jj}(2:end,1)),1));
  end
end

が表示されることに注意してくださいIndex exceeds matrix dimensions。ただし、これは別の問題によるものです。問題を解決できるはずです。

于 2013-02-14T09:18:55.643 に答える