避免在循环中

2次观看(最近30天)
大家好 :)
我想在矢量上运行循环。如何处理向量中的每个元素取决于许多IF-ELSE语句。我这样简化了它:
清除变量;
RNG默认;
v1 = rand(365,1);
v2 = rand(365,1);
v2 = v2 <= 0.5;
v3 = rand(365,1);
v3 = v3 <= 0.3;
vresult =零(长度(v1),1);
tstart = 1;
趋势=长度(v1);
为了t = tstart:趋势
如果v2(t)== 1
如果v3(t)== 1
vresult(t)= do_stuff(v1(t));
别的
vresult(t)= do_different_stuff(v1(t));
结尾
别的
如果v3(t)== 1
vresult(t)= do_even_different_stuff(v1(t));
别的
vresult(t)= do_even_more_different_stuff(v1(t))
结尾
结尾
结尾
功能[var_out] = do_stuff(var_in)
var_out = var_in * 5;
结尾
功能[var_out] = do_different_stuff(var_in)
var_out = var_in + 3;
结尾
功能[var_out] = do_even_different_stuff(var_in)
var_out = var_in / 4;
结尾
功能[var_out] = do_even_more_different_stuff(var_in)
var_out = var_in -2;
结尾
有了更多的IF-ELSE条件和每个语句的计算,它确实令人困惑和不可读。而且我觉得我一遍又一遍地编写相同的代码,因为每个语句中的某些部分都不同,而其他部分则保持不变。
如何使我的代码更有效,更易于阅读和可维护?抱歉,如果这应该是常识:D
3条评论
亚当·丹兹(Adam Danz)
亚当·丹兹(Adam Danz) 2019年12月11日
如果可以将这些功能进行矢量化,则可以通过提供的答案说明了最佳方法。 亚当 “。如果您需要在循环中的V1的每个值上执行这些功能,则我提供的答案(” 亚当·丹兹(Adam Danz) ”)比嵌套条件语句要干净。

登录发表评论。

接受的答案

亚当·丹兹(Adam Danz)
亚当·丹兹(Adam Danz) 2019年12月11日
我假设提供的本地功能只是演示功能。如果这些功能可以是 矢量化 ,您很可能根本不需要循环或任何有条件的语句。
这是在向量的每个元素上执行函数的方法 v1 基于 v2(n) v3(n) 都是逻辑向量。它使用一个 开关案例 而不是一系列条件语句。开关表达式必须是标量或char矢量,这就是为什么我将逻辑值转换为1个为true而0为false的char的原因。
vall = [v2,v3];
为了t = tstart:趋势
转变sprintf('%d%d',vall(t,:))
案子'1 1'
vresult(t)= do_stuff(v1(t));
案子'1 0'
vresult(t)= do_different_stuff(v1(t));
案子'0 1'
vresult(t)= do_even_different_stuff(v1(t));
案子'0 0'
vresult(t)= do_even_more_different_stuff(v1(t));
否则
百分比这绝对不会发生,除非瓦尔出乎意料
错误(“内部变量”'vall''。
结尾
结尾
2条评论
亚当·丹兹(Adam Danz)
亚当·丹兹(Adam Danz) 2019年12月11日
我喜欢使用数字而不是char矢量的想法(巧妙地使用polyval!)。 瓦尔 是NX2逻辑矩阵,因此开关需要为
vall = [v2,v3];
为了t = tstart:趋势
转变polyval(vall(t,:),2)
案子0%v2 = 0,v3 = 0
案子1%v2 = 0,v3 = 1
案子2%v2 = 1,v3 = 0
否则%v2 = 1,v3 = 1
结尾
结尾

登录发表评论。

更多答案(1)

亚当
亚当 2019年12月11日
编辑:亚当 2019年12月11日
像这样的事情似乎可以完成工作,尽管我可能会过度简化它...
case1 = v2 && v3;
case2 = v2 && 〜v3;
case3 = 〜v2 && v3;
case4 = 〜v2 && 〜v3;
vresult(case1)= do_stuff(v1(case1));
vresult(case2)= do_different_stuff(v1(case2));
vresult(case3)= do_even_different_stuff(v1(case3));
vresult(case4)= do_even_more_different_stuff(v1(case4));

标签

下载188bet金宝搏


发布

R2019b

社区寻宝

在Matlab Central中找到宝藏,发现社区如何为您提供帮助!

开始狩猎!