Hi all,
I am creating a function that allows me to obtain certain data of Steel Members.
I have created limits that give an interval over which to select a particular member.
Here is my code:
function [HD_cols] = members(Ic);
HD400_1299 = [755000/100^4; 1655/100^2; 1299];
HD400_1202 = [664000/100^4; 1530/100^2; 1202];
HD400_1086 = [596000/100^4; 1386/100^2; 1086];
HD400_990 = [519000/100^4; 1262/100^2; 990];
HD400_900 = [450000/100^4; 1149/100^2; 900];
HD400_818 = [392000/100^4; 1043/100^2; 818];
HD400_744 = [342000/100^4; 948/100^2; 744];
HD400_677 = [300000/100^4; 863/100^2; 677];
HD400_634 = [274000/100^4; 808/100^2; 634];
HD400_592 = [250000/100^4; 755/100^2; 592];
HD400_551 = [226000/100^4; 701/100^2; 551];
HD400_509 = [204000/100^4; 649/100^2; 509];
HD400_463 = [180000/100^4; 590/100^2; 463];
HD400_421 = [160000/100^4; 537/100^2; 421];
T = table(HD400_1299,HD400_1202,HD400_1086,HD400_990,HD400_900,HD400_818,HD400_744,HD400_677,HD400_634,HD400_592,HD400_551,HD400_509,HD400_463,HD400_421);
for i = 1:length(Tx)-1
Limits(i) = (Tx(1,i)+Tx(1,i+1))/2;
end
if Ic > Limits(1)
Ic = HD400_1299
elseif Ic > Limits(2)
Ic = HD400_1202
elseif Ic > Limits(3)
Ic = HD400_1086
elseif Ic > Limits(4)
Ic = HD400_990
elseif Ic > Limits(5)
Ic = HD400_900
elseif Ic > Limits(6)
Ic = HD400_818
elseif Ic > Limits(7)
Ic = HD400_744
elseif Ic > Limits(8)
Ic = HD400_677
elseif Ic > Limits(9)
Ic = HD400_634
elseif Ic > Limits(10)
Ic = HD400_592
elseif Ic > Limits(11)
Ic = HD400_551
elseif Ic > Limits(12)
Ic = HD400_509
elseif Ic > Limits(13)
Ic = HD400_463
elseif Ic > Limits(14)
Ic = HD400_421
end
end
My request is, can somone show me how I can simplify and make more efficient my if statements? Perhaps I need to use a loop? I want to add more members to more script and typing like I have above is tedious and not very efficient. So, I'm hoping someone can help?
Many thanks,
Scott

댓글 수: 3

Sam Chak
Sam Chak 2025년 9월 4일
I believe you are using the logical indexing technique for data segregation. Are you looking for ways to make the code run much faster, rather than checking true/false values one by one?
Yes, I believe something like that.
Sorry, i have realised that one vector is missing
Tx = table2array(T);

댓글을 달려면 로그인하십시오.

 채택된 답변

Stephen23
Stephen23 2025년 9월 4일
편집: Stephen23 2025년 9월 4일

2 개 추천

"A more efficient way to do this calculation"
Use vectors and matrices!
The name MATLAB comes from "MATrix LABoratory", its primary data type is the matrix, because MATLAB processess data efficiently in matrices. When you design your data stored in lots and lots and lots of separate variables then you are shooting yourself in the foot. Placing meta-data in variable names is a very strong sign that you are doing something wrong (and invariably leads users to writing much more complex, inefficient code). Meta-data is data, it should be stored in variables not in variable names.
Here a DIY approach using indexing:
function HD_cols = members1(Ic)
loadVals = [160000; 180000; 204000; 226000; 250000; 274000; 300000; 342000; 392000; 450000; 519000; 596000; 664000; 755000] ./ 100^4;
constVals = [ 537; 590; 649; 701; 755; 808; 863; 948; 1043; 1149; 1262; 1386; 1530; 1655] ./ 100^2;
idVals = [ 421; 463; 509; 551; 592; 634; 677; 744; 818; 900; 990; 1086; 1202; 1299];
midpoints = (loadVals(1:end-1) + loadVals(2:end)) / 2;
midpoints(end+1) = Inf;
idx = find(Ic<=midpoints,1,'first');
HD_cols = [loadVals(idx); constVals(idx); idVals(idx)];
end
or a more modern approach using DISCRETIZE (as Steven Lord mentioned):
function HD_cols = members2(Ic)
loadVals = [160000, 180000, 204000, 226000, 250000, 274000, 300000, 342000, 392000, 450000, 519000, 596000, 664000, 755000] ./ 100^4;
constVals = [ 537, 590, 649, 701, 755, 808, 863, 948, 1043, 1149, 1262, 1386, 1530, 1655] ./ 100^2;
idVals = [ 421, 463, 509, 551, 592, 634, 677, 744, 818, 900, 990, 1086, 1202, 1299];
midpoints = (loadVals(1:end-1) + loadVals(2:end)) / 2;
idx = discretize(Ic,[-Inf,midpoints,Inf]);
HD_cols = [loadVals(idx); constVals(idx); idVals(idx)];
end

댓글 수: 4

Scott Banks
Scott Banks 2025년 9월 4일
편집: Scott Banks 2025년 9월 4일
Hi Stephen, yes, I have been using matrices and vectors more as per a previous discussion we had. Although, you wouldn't know it from this script.
Sorry, but could you calirfy in regards to variables and variable names? What are you meaning by that?
Torsten
Torsten 2025년 9월 4일
편집: Torsten 2025년 9월 4일
Sorry, but could you calirfy in regards to variables and variable names? What are you meaning by that?
It means that you shouldn't address the different HD400 types by their names, but by the column number where they are stored in a properties vector.
Stephen23
Stephen23 2025년 9월 4일
편집: Stephen23 2025년 9월 4일
Take a look at those variable names and the meta-data that you put into them:
HD400_1299 = ..
% ^^^^ meta-data / data
Putting meta-data into variable names is a dead end, a shot in the foot. It means that any change in that data requires rewriting the code and/or using inefficient meta-programming commands. For example, after writing lots and lots of variables with meta-data in their names users often ask how they can efficiently iterate over them or process their data.
There is no efficient or simple way to do this, because of their data design:
In general using matrices and arrays to store meta-data (which is data) allows for much more efficient data access and operations, simpler code, easier debugging, etc. Generalising the code is much easier too.
Okay, thanks for your explanation guys!

댓글을 달려면 로그인하십시오.

추가 답변 (2개)

Steven Lord
Steven Lord 2025년 9월 4일

2 개 추천

Take a look at the discretize function.
Matt J
Matt J 2025년 9월 4일
편집: Matt J 2025년 9월 4일

1 개 추천

function [HD_cols] = members(Ic);
HD = [ ...
160000/100^4, 180000/100^4, 204000/100^4, 226000/100^4, 250000/100^4, ...
274000/100^4, 300000/100^4, 342000/100^4, 392000/100^4, 450000/100^4, ...
519000/100^4, 596000/100^4, 664000/100^4, 755000/100^4;
537/100^2, 590/100^2, 649/100^2, 701/100^2, 755/100^2, ...
808/100^2, 863/100^2, 948/100^2, 1043/100^2, 1149/100^2, ...
1262/100^2, 1386/100^2, 1530/100^2, 1655/100^2;
421, 463, 509, 551, 592, ...
634, 677, 744, 818, 900, ...
990, 1086, 1202, 1299 ...
];
Limits=[ movmean(HD(1,:),[0,1],Endpoints='discard')) , inf];
HD_cols=HD(:, discretize(Ic,Limits) );
end

카테고리

도움말 센터File Exchange에서 Loops and Conditional Statements에 대해 자세히 알아보기

질문:

2025년 9월 4일

댓글:

2025년 9월 4일

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by