我遇到以下代码的问题。如果条件为真,我希望代码执行第一个语句。但是,无论条件如何,它似乎只执行第二个语句。如果delta <0.9843&#39;不正确的?
encode_entities
答案 0 :(得分:3)
实际上,您正在混合矢量化(矩阵方式执行的操作)和非矢量化方法(一次对单个值执行的操作)。在您当前的配置中,如果您测试delta < 0.9843
,这将是您将获得的:
ans =
1×12 logical array
1 1 1 0 0 0 0 0 0 0 0 0
logical
数组1
,其值小于阈值,否则为0
。因此,if条件将在数组上执行,而不是在boolean
变量上执行,从而产生不太重要的结果。
您尝试执行的计算可以按矢量化方式完成,如下所示:
D = 22.441;
W = 9.843;
P = 65.27;
delta = [0, 0.4, 0.8, 1.2, 1.6, 2, 2.4, 2.8, 3.2, 3.6, 4,4.4];
delta_min = delta < 0.9843;
delta_min_vals = delta(delta_min);
delta(delta_min) = ((P+0.08*P)*W*(W*D).^0.5)*(0.96*(delta_min_vals/W)+(0.216/0.03)*(delta_min_vals/W).^2);
delta_oth_vals = delta(~delta_min);
delta(~delta_min) = ((P+0.08*P)*W*(W*D).^0.5*(2.4*((delta_oth_vals/W)-0.03)));
% delta now represents the zdelta you were looking for
如果你想使用非矢量化计算执行相同的操作(我不鼓励你因为Matlab在使用矢量化计算时具有更好的性能),例如在for-loop
内,请使用以下代码:
D = 22.441;
W = 9.843;
P = 65.27;
delta = [0,0.4, 0.8, 1.2, 1.6, 2, 2.4, 2.8, 3.2, 3.6, 4,4.4];
delta_size = size(delta);
zdelta = NaN(delta_size);
for i = 1:delta_size(2)
delta_curr = delta(i);
if (delta_curr < 0.9843)
zdelta_curr = ((P+0.08*P)*W*(W*D)^0.5)*(0.96*(delta_curr/W)+(0.216/0.03)*(delta_curr/W)^2);
else
zdelta_curr = ((P+0.08*P)*W*(W*D)^0.5*(2.4*((delta_curr/W)-0.03)));
end
zdelta(i) = zdelta_curr;
disp(zdelta_curr);
end