перебрать структуры и найти корреляцию - PullRequest
1 голос
/ 27 февраля 2012

Следующий пример напоминает похожую проблему, с которой я имею дело, хотя приведенный ниже код является просто примером, он структурирован в том же формате, что и мой фактический набор данных.

clear all

England = struct('AirT',rand(320,1),'SolRad',rand(320,1),'Rain',rand(320,1));
Wales = struct('AirT',rand(320,1),'SolRad',rand(320,1),'Rain',rand(320,1));
Ireland = struct('AirT',rand(320,1),'SolRad',rand(320,1),'Rain',rand(320,1));
Scotland = struct('AirT',rand(320,1),'SolRad',rand(320,1),'Rain',rand(320,1));

Location = struct('England',England,'Wales', Wales, 'Ireland',Ireland,'Scotland',Scotland);

FieldName={'England','Wales','Scotland','Ireland'};
Data = {England.AirT,Wales.AirT,Scotland.AirT,Ireland.AirT};
Data = [FieldName;Data];
Data = struct(Data{:});
Data = cell2mat(struct2cell(Data)');
[R,P] = corrcoef(Data,'rows','pairwise');
R_Value= [FieldName(nchoosek(1:size(R,1),2)) num2cell(nonzeros(tril(R,-1)))];

Итак, этот скрипт покажет корреляцию между парами температуры воздуха в 4 местах. Я ищу способ также посмотреть на корреляцию между SolRad и Rain между местоположениями (тот же процесс, что и для AirT) или любыми переменными, обозначенными в структуре. Я мог бы сделать это, заменив входные данные на «Данные», но это кажется довольно длинным, особенно когда задействовано много различных переменных. Есть идеи, как это сделать? Я попытался использовать цикл, но это кажется сложнее, чем я, хотя попытаться получить данные в том же формате, что и в примере.

Ответы [ 2 ]

1 голос
/ 27 февраля 2012

Давайте посмотрим, поможет ли это, или это то, о чем вы думаете:

clear all

England = struct('AirT',rand(320,1),'SolRad',rand(320,1),'Rain',rand(320,1));
Wales = struct('AirT',rand(320,1),'SolRad',rand(320,1),'Rain',rand(320,1));
Ireland = struct('AirT',rand(320,1),'SolRad',rand(320,1),'Rain',rand(320,1));
Scotland = struct('AirT',rand(320,1),'SolRad',rand(320,1),'Rain',rand(320,1));

Location = struct('England',England,'Wales', Wales, 'Ireland',Ireland,'Scotland',Scotland);

% get all the location fields
FieldName = transpose(fieldnames(Location));
% get the variables recorded at the first location
CorrData = fieldnames(Location.(FieldName{1}));
% get variables which were stored at all locations(just to be safe,
% we know that they are all the same)
for ii=2:length(FieldName)
  CorrData = intersect(CorrData,fieldnames(Location.(FieldName{ii})));
end

% process each variable that was recorded
for ii=1:length(CorrData)
  Data = cell(1,length(FieldName));
  % get the variable data from each location and store in Data
  for jj=1:length(FieldName)
    Data{jj} = Location.(FieldName{jj}).(CorrData{ii});
  end
  % process the data
  Data = [FieldName;Data];
  Data = struct(Data{:});
  Data = cell2mat(struct2cell(Data)');
  [R,P] = corrcoef(Data,'rows','pairwise');
  R_Value= [FieldName(nchoosek(1:size(R,1),2)) num2cell(nonzeros(tril(R,-1)))];
  % display the data, sounds good right?
  fprintf(1,'Correlation for %s\n',CorrData{ii});
  for jj=1:size(R_Value,1)
    fprintf(1,'%s\t%s\t%f\n',R_Value{jj,1},R_Value{jj,2},R_Value{jj,3});
  end
end

Дайте мне знать, если я неправильно понял, или это более сложно, чем вы думали.Спасибо!

0 голосов
/ 27 февраля 2012

имена полей (s) и ссылки на динамические поля являются вашими друзьями.

Я бы предложил создать одну структуру, в которой 'name' является полеми другие поля - то, что вы хотите.Независимо от того, как вы настроили structure s, вы можете использовать fn = fieldnames(s); для возврата массива ячеек полей.Вы можете получить доступ к содержимому вашей структуры, используя эти имена, используя круглые скобки вокруг переменной, содержащей имя.

fn = fieldnames(s);
for i=1:length(fn)
disp([fn{i} ':' s.(fn{i})]
end

Разумеется, все, что вы делаете со значениями, зависит от вас!

...