2012-03-10 6 views
0

Afin de rendre cette question plus facile à décrire, j'ai fourni le code exemple suivant, qui est similaire aux données réelles, je travaille avec:découpant une chaîne en Matlab

clear all 
AirT = {rand(32,1),rand(32,1),rand(32,1),rand(32,1)}; 
SolRad = {rand(32,1),rand(32,1),rand(32,1),rand(32,1)}; 
Rain = {rand(32,1),rand(32,1),rand(32,1),rand(32,1)}; 
Location = {'England','Wales','Scotland','Ireland'}; 
points = {'old','old','old','new'}; 
CorrVariables = {'AirT','SolRad','Rain'}; 
for i = 1:length(Location); 
    Data = @(location) struct('Location',location,CorrVariables{1},AirT{i},... 
     CorrVariables{2},SolRad{i},CorrVariables{3},Rain{i}); 
    D(i) = Data(Location{i}); 
end 
FieldName = {D.Location}; 
R = corrcoef([D.AirT],'rows','pairwise'); 
R_Value = [Location(nchoosek(1:size(R,1),2)) num2cell(nonzeros(tril(R,-1)))]; 
q = points(nchoosek(1:size(R,1),2)); 
    %to calculate the combination of these points we need to convert the 
    %cell into a matrix. 
Re = [R_Value q]; 

De cet exemple, je voudrais pour créer un autre tableau de cellules dans la colonne 5 de Re qui dépend des chaînes dans les colonnes 4 et 5. Donc, si les colonnes 4 et 5 dans Re sont égales, comme "old''old" alors la colonne 6 devrait montrer "old" . Cependant, si les cellules diffèrent, par ex. 'ancien' 'nouveau' alors je voudrais que le nouveau tableau de cellules (c'est-à-dire la colonne 6 dans Re) indique 'ancien/nouveau'.

Comment cela serait-il possible?

Répondre

2

D'après votre description, je pense que la plus claire approche consiste à utiliser une combinaison de concaténation de chaînes et expressions régulières.

d'abord combiner les colonnes 4 et 5 dans une nouvelle colonne:

newColumn = strcat(Re(:,4), '/', Re(:,5)); 

Regardez maintenant pour le motif répété et le remplacer par le premier jeton assorti:

newColumn = regexprep(newColumn, '(\w+)/\1', '$1'); 

Combine dans la matrice cellulaire existante:

Re = [Re, newColumn];