避免在循环中
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)
2019年12月11日
如果可以将这些功能进行矢量化,则可以通过提供的答案说明了最佳方法。
亚当
“。如果您需要在循环中的V1的每个值上执行这些功能,则我提供的答案(”
亚当·丹兹(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)
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));