How do I create an element wise if-else code, and apply equations to inputs that meet certain criteria?

12 次查看(过去 30 天)
Here is my code, (sigma is a (74724,1) column vector)
Eya = 2.83*10^7;
Y = log10((28300.*sigma)/Eya)
X1 = (17.0181 - 19.8713*Y + 4.21366*Y.^2)./(1 - 0.1720606*Y - 0.633592*Y.^2)
X2 = 1./(-.331096 + (4.3261*log(Y))./Y.^2)
if 10.^Y >= 14.4; %**this is where i assume my issue lies**
X = X1;
else
X = X2;
end
N = 10.^X %Allowable number of cycles (should be very high)
nc = 45000; %Total number of actual cycles (constant)
D = nc./N %Damage ratio (should be very low for most values of sigma, and never exceeding 1)
I need a new vector, X, (74724,1) to be created from either X1 or X2 depending on Y meeting the criteria as seen in the if then statement
Any help is much appreciated, Thank you!

回答(1 个)

Jan
Jan 2022-3-29
编辑:Jan 2022-3-29
"Elementwise" does either mean a loop:
for k = 1:numel(sigma)
Y = log10(28300 * sigma(k) / Eya);
...
end
Or you use logical indexing:
...
m = 10.^Y >= 14.4;
X = zeros(size(sigma));
X(m) = X1(m);
X(~m) = X2(~m);
...
or slightly easier:
...
m = 10.^Y >= 14.4;
X = X2;
X(m) = X1(m);
...
As usual I mention, that 2.83*10^7 is a multiplication and an expensive power operation, while 2.83e7 is a cheap constant.
  2 个评论
Nick Lavanture
Nick Lavanture 2022-3-29
Thank you, unfortunately none of these solutions worked, here is my current script
clc,clear
Stress = readmatrix('Nonlinear 1 Stress 500psi.txt');
sigma = Stress(:,5);
n = 1;
for n = 1:74723; %this loop converts any sub 1000psi value of sigma to 1000psi, necessay to avoid a negative log and imaginary numbers for X2
if sigma(n) < 1000;
sigma(n) = 1000;
end
n = n+1;
end
%sigma = 13000;
%test input, will overwrite the above data, and output the correct values I am looking for
Eya = 2.83e7;
Y = log10((28300.*sigma)/Eya)
X1 = (17.0181 - 19.8713*Y + 4.21366*Y.^2)./(1 - 0.1720606*Y - 0.633592*Y.^2)
X2 = 1./(-.331096 + (4.3261*log(Y))./Y.^2)
%if 10.^Y >= 14.4;
%X = X1;
%else
%X = X2;
%end
%m = 10.^Y >= 14.4;
%X = X2;
%X(m) = X1(m);
m = 10.^Y >= 14.4;
X = zeros(size(sigma));
X(m) = X1(m);
X(~m) = X2(~m);
N = 10.^X
nc = 45000;
D = nc./N
Jan
Jan 2022-3-30
This is not the way for loops work:
for n = 1:74723 % No ;
if sigma(n) < 1000;
sigma(n) = 1000;
end
n = n+1; % Nope, omit this!
end
A nicer code to perform this without a loop:
sigma = min(sigma, 1000);
Please mention, what "none of these solutions work" mean. Do you get an error message? Does the result differ from your expectations? I do not have your input data, so I cannot run the code by my self. If you do not explain, what the problem is, I cannot guess it.

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Graphics Object Programming 的更多信息

产品


版本

R2022a

Community Treasure Hunt

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

Start Hunting!

Translated by