strcmp with or-condition
21 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Max Bornemann
le 15 Avr 2019
Commenté : Ben Cunningham
le 23 Avr 2019
Hello,
i have the following two tables:
Tab1=table('Size',[9 3],'VariableTypes',{'cell','double','double'},'VariableNames',{'Description','Year','Value'});
Tab1.Description(:)={'Gas','Gas','Gas','Pellets','Pellets','Pellets','Oil','Oil','Oil'};
Tab1.Year(:)=[2015,2020,2025,2015,2020,2025,2015,2020,2025];
Tab2=table('Size',[6 3],'VariableTypes',{'cell','double','double'},'VariableNames',{'Description','Year','Value'});
Tab2.Description(:)={'Wood','Wood','Wood','FW','FW','FW'};
Tab2.Year(:)=[2015,2020,2025,2015,2020,2025];
Tab2.Value(:)=[5,10,17,7,25,75];
I try the following calculation:
Tab1(strcmp(Tab1.Description,or('Gas','Oil')),'Value')=Tab2(strcmp(Tab2.Description,'FW'),'Value');
The or-part seems to be the problem. I want the Value of 'FW' from Tab2 as the Value of 'Gas' and 'Oil' in Tab1. My original table is way bigger, so seperate calculations like:
Tab1(strcmp(Tab1.Description,'Gas'),'Value')=Tab2(strcmp(Tab2.Description,'FW'),'Value');
Tab1(strcmp(Tab1.Description,'Oil'),'Value')=Tab2(strcmp(Tab2.Description,'FW'),'Value');
are not purposeful. Maybe an if-condition with
||
could help, but i dont know how.
I will greatly appreciate any assistance.
3 commentaires
Réponse acceptée
Ben Cunningham
le 16 Avr 2019
Modifié(e) : Ben Cunningham
le 16 Avr 2019
Generally I would recommend just writing out two lines as Adam proposed earlier.
But if you really want 'one line' with a list of strings to index then you could wrap it in a for loop :
for DescriptionIndex = {'Gas', 'Oil'}, Tab1(strcmp(Tab1.Description, DescriptionIndex),'Value')=Tab2(strcmp(Tab2.Description,'FW'),'Value'); end
5 commentaires
Ben Cunningham
le 23 Avr 2019
Well found!
If you are doing this mulitiple times you might consider putting this code in a nicely named function which may help it look clearer.
(Name the function something that makes sense for what you are doing - also the variables might benefit from clearer names).
e.g. At the end of your script :
function TabOut = myFunctionName (Tab1, Tab2, Tab3, Sum)
% My Function does something
for Sum1 = Sum
Tab2{strcmp(Tab2.Description,Sum1(1,:)),'Value'}=Tab1{strcmp(Tab1.Description,Sum1(1,:)),'Value'}+Tab3{strcmp(Tab3.Description,Sum1(2,:)),'Value'};
end
TabOut = Tab2;
end
Then in your script you can write :
Tab2 = myFunctionName (Tab1, Tab2, Tab3, {'Pellets','Oil','Heatpump';'Wood','HeatingOil','Heat'})
Plus de réponses (1)
Adam Danz
le 16 Avr 2019
Modifié(e) : Adam Danz
le 16 Avr 2019
You would use ismember() to find the rows of Tab1.Description that match a list of options.
ismember(Tab1.Description, {'Gas', 'Oil'})
However, you'll find out that this matches 6 rows but the data on the right hand side of the equal sign only produces 3 rows.
What I think you're trying to do is to assign those 3 values to all rows in Tab1 that are labeled 'Gas' and to assign those 3 values to all rows labeled 'Oil', too.
Tab1(strcmp(Tab1.Description,'Gas'),'Value')=Tab2(strcmp(Tab2.Description,'FW'),'Value');
Tab1(strcmp(Tab1.Description,'Oil'),'Value')=Tab2(strcmp(Tab2.Description,'FW'),'Value');
3 commentaires
Adam Danz
le 16 Avr 2019
Nice! Glad it worked out. My advice is to write the for-loop using separate lines rather than forcing it into a single line. It doesn't change the speed of performance - it's just more readable as separate lines.
Voir également
Catégories
En savoir plus sur String Parsing dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!