A more efficient way to do this calculation

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 Comments

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);

Sign in to comment.

 Accepted Answer

"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 Comments

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 on 4 Sep 2025
Edited: Torsten on 4 Sep 2025
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.
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!

Sign in to comment.

More Answers (2)

Matt J
Matt J on 4 Sep 2025
Edited: Matt J on 4 Sep 2025
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

Categories

Community Treasure Hunt

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

Start Hunting!