커뮤니티

수식 문의

프로필 이미지
에구머니
2021-02-02 10:55:23
820
글번호 146025
답변완료
안녕하세요? Fct1(g1, ...), ... Fct10(g10, ...) 이라는 꽤 복잡한 함수들이 있습니다. 게다가 Fct1 에는 g1 이라는 꽤 복잡한 녀석을 인수로 갖고, ... Fct10은 g10 이라는 꽤 복잡한 녀석을 인수로 갖습니다. input: a1(0), ... a10(0) // a1 ~ a10은 0 또는 자연수 var: sum(0); g1 = 어쩌구 저쩌구 if 도 들어가고, {...} 들도 들어가고 열라 복잡. g2 = 어쩌구 저쩌구 if 도 들어가고, {...} 들도 들어가고 열라 복잡. ... g10 = 어쩌구 저쩌구 if 도 들어가고, {...} 들도 들어가고 열라 복잡. sum = a1*Fct1 + ... + a10*Fct10; 을 계산하고 싶은데, 시스템의 부하를 줄이기 위해서 a1, ... a10 중 0이 아닌 경우에만 해당 Fct을 계산하고 싶습니다. 그러니까 a1 == 0 이면 g1 계산도 건너뛰고, Fct1 도 계산안하고 넘어가고 (말하자면 그냥 0 대입...) a3 > 0 면 그 때에는 g3도 계산하고, Fct3도 계산하고, ... 뭐 이런 식으로 시스템 부하를 줄이고 싶습니다. 좋은 방법이 있겠습니까? 또 그러면 정말로 시스템 부하가 g1, Fct1 계산을 생략하는 것만큼 줄까요? 혹시, var1 ~ var99, value1 ~ value99 의 초기값이 0이란 것을 이용해서 계산량이나 시스템 부하를 줄일 수 있다면 이런 것들도 적극적으로 같이 사용해 주시기 바랍니다. 그러니까, 목표는 수단 방법을 안 가리고, 시스템 부하를 줄이는 것입니다. 위의 함수들 Fct1, ... Fct10이 내부에 또 함수들을 사용하는 등, 꽤나 복잡해서요, 몇 개라도 줄일 수 있다면 안정성 등에서 참 좋겠습니다. 감사합니다.
시스템
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2021-02-02 13:24:00

안녕하세요 예스스탁입니다. 수식이 전체 문장을 스캔하는 체계라 함수식 계산을 막을 방법은 없습니다. if a1 > 0 Then { f1 = fct1(~~~~); g1 = 계산식; } Else { f1 = 0; g1 = 0; } 위와 같이 처리해도 크게 차이는 없습니다. 수식의 계산속도나 부하를 줄이시려면 전체수식에서 함수 포함해서 동일 계산을 한번만 하게 하셔야 합니다. fct1~10의 함수내용은 알수 없으므로 만약 아래와 같은 시스템이 지표식이 있다면 Input : Period(20), MultiD(2); var : BBmd(0),BBup(0),BBdn(0); BBmd = ma(C,Period); #1 BBup = BollBandUp(Period,MultiD);#2 BBdn = BollBandDown(Period,MultiD);#3 Plot1(BBup, "상단"); Plot2(BBdn, "하단"); 실제 10줄도 안되는 수식이지만 내부적으로 위 지표식은 이동평균은 5번, 표준편차가 2번 계산됩니다. #1계산을 위해 이평계산1번, #2계산을 위해 이평계산1번,표준편차1번(표준편차에 이평계산 1번추가) #3계산을 위해 이평계산1번,표준편차1번(표준편차에 이평계산 1번추가) 함수를 이용해 작성하면 간단하지만 실제 부하를 줄이기 위해서는 아래와 같이 작성하면 이평계산은 2번,표준편차 1번이 됩니다. Input : Period(20), MultiD(2); var : BBmd(0),stdv(0),BBup(0),BBdn(0); BBmd = ma(C,Period); stdv = std(C,Period); Bbup = bbmd+stdv*MultiD; BBdn = bbmd-stdv*MultiD; Plot1(BBup, "상단"); Plot2(BBdn, "하단"); 다시 표준편차도 아래와 같이 풀어쓰면 이평1번, 표준편차 1번으로 계산횟수가 작아지게 됩니다. Input : Period(20), MultiD(2); var : BBmd(0),SumSqrt(0),stdv(0),BBup(0),BBdn(0),cnt(0); BBmd = ma(C,Period); SumSqrt = 0; For cnt = 0 To Period- 1 { SumSqrt = SumSqrt + (C[cnt] - BBmd)^2; } Stdv = SquareRoot(SumSqrt / Period); Bbup = bbmd+stdv*MultiD; BBdn = bbmd-stdv*MultiD; Plot1(BBup, "상단"); Plot2(BBdn, "하단"); 즉 이평을 한번만 계산해서 변수에 저장하고 필요한 곳에 사용하게 해서 불필요한 동일계산의 횟수를 줄이는 것입니다. 사용자함수를 사용하는 것도 실제 수식에서 해당 함수식 내용을 나열해 작성하는 것과 같습니다. 각 함수 내용안에 동일한 계산이 있다면 위와 같이 풀어서 한번 계산으로 필요한 곳에 변수만 가져가서 사용하게 만드셔야 부하를 줄이실수 있습니다. 해당 방법이 아니면 별도로 줄일방법이 마땅히 없습니다. 즐거운 하루되세요 > 에구머니 님이 쓴 글입니다. > 제목 : 수식 문의 > 안녕하세요? Fct1(g1, ...), ... Fct10(g10, ...) 이라는 꽤 복잡한 함수들이 있습니다. 게다가 Fct1 에는 g1 이라는 꽤 복잡한 녀석을 인수로 갖고, ... Fct10은 g10 이라는 꽤 복잡한 녀석을 인수로 갖습니다. input: a1(0), ... a10(0) // a1 ~ a10은 0 또는 자연수 var: sum(0); g1 = 어쩌구 저쩌구 if 도 들어가고, {...} 들도 들어가고 열라 복잡. g2 = 어쩌구 저쩌구 if 도 들어가고, {...} 들도 들어가고 열라 복잡. ... g10 = 어쩌구 저쩌구 if 도 들어가고, {...} 들도 들어가고 열라 복잡. sum = a1*Fct1 + ... + a10*Fct10; 을 계산하고 싶은데, 시스템의 부하를 줄이기 위해서 a1, ... a10 중 0이 아닌 경우에만 해당 Fct을 계산하고 싶습니다. 그러니까 a1 == 0 이면 g1 계산도 건너뛰고, Fct1 도 계산안하고 넘어가고 (말하자면 그냥 0 대입...) a3 > 0 면 그 때에는 g3도 계산하고, Fct3도 계산하고, ... 뭐 이런 식으로 시스템 부하를 줄이고 싶습니다. 좋은 방법이 있겠습니까? 또 그러면 정말로 시스템 부하가 g1, Fct1 계산을 생략하는 것만큼 줄까요? 혹시, var1 ~ var99, value1 ~ value99 의 초기값이 0이란 것을 이용해서 계산량이나 시스템 부하를 줄일 수 있다면 이런 것들도 적극적으로 같이 사용해 주시기 바랍니다. 그러니까, 목표는 수단 방법을 안 가리고, 시스템 부하를 줄이는 것입니다. 위의 함수들 Fct1, ... Fct10이 내부에 또 함수들을 사용하는 등, 꽤나 복잡해서요, 몇 개라도 줄일 수 있다면 안정성 등에서 참 좋겠습니다. 감사합니다.