strcmp with or-condition
조회 수: 20 (최근 30일)
이전 댓글 표시
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
채택된 답변
Ben Cunningham
2019년 4월 16일
편집: Ben Cunningham
2019년 4월 16일
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
Ben Cunningham
2019년 4월 23일
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'})
추가 답변 (1개)
Adam Danz
2019년 4월 16일
편집: Adam Danz
2019년 4월 16일
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
Adam Danz
2019년 4월 16일
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.
참고 항목
카테고리
Help Center 및 File Exchange에서 String Parsing에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!