[MATLAB] 숫자열에 숫자가 아닌 것(NaN)이 포함되어 있을 때 평균내기, mean 함수 응용

만약 100개 숫자가 있는데, 그 중 몇 개가 NaN, 즉 Not a Number인 경우 평균을 어떻게 구하겠는가? 당연히 숫자가 아닌 것이 포함되어 있으므로 제대로 평균을 구할 수가 없다. 그렇지만 그 NaN들을 제외하고 평균을 구하고 싶을 수도 있다. 

 

숫자열이 다음과 같다고 가정해보자. 

 

A = [1, 2, 3, 4, 5, NaN, 7, 8, 9, 10];

 

이런 경우에는 다음과 같이 코드를 작성하면 된다.

 

mean(A, 'omitnan');

 

그러면 NaN을 제외하고 나머지 값들에 대한 평균값을 계산해준다. 

 

참고로 (1 + 2 + 3 + 4 + 5 + 7 + 8 + 9 + 10)/9 = 5.4444이다. 

 

만약 'omitnan'없이 그냥 mean(A)를 해주면 NaN이 출력된다.

 

 

태그 : matlab, Nan, 평균

댓글()

[MATLAB] 적분하기, integral 함수

간단한 2차 함수를 적분해보자.

$y = -x^2 + 4x$

구간 [0, 4]에서 함수를 정적분하려면 다음과 같이 코드를 작성해야 한다. 


실행하면 다음과 같이 적분 결과가 산출된다. (손으로 해도 아래 결과 나오니 안심하세요^^)  


두번째로는 로그함수를 적분해보자.

$y = \log{x}$

구간 [0, 5]에서 정적분하려면, 아래와 같이 코드를 작성하면 된다. 

 

결과는 다음과 같다.

 

 

그다지 어렵지 않기에 이정도로 글을 마치려고 합니다.^^

댓글()

[MATLAB] 방정식 해 구하기, solve 함수

간단한 방정식의 경우 눈으로, 또 손으로 쉽게 풀어낼 수 있지만, 왠만한 고차원의 방정식은 계산하기 쉽지 않다. 그렇다면 매트랩으로 방정식의 해를 구해보자.

먼저 간단한 예를 들어보겠다. $x^2 + 2x + 1 = 0$ 의 해는 중근으로 -1임을 우리는 쉽게 알 수 있다. 이것을 매트랩을 구현하면, 아래와 같다.



먼저 방정식의 변수를 syms 명령어를 이용해서 설정해주고, 그 다음 방정식을 입력해준다. solve 함수에 방정식과 변수를 입력해주면 방정식의 해가 출력된다.

간단한 예를 하나 더 들겠다. $x^3 - 6x^2 + 11x - 6 =0$의 해는 무엇일까? 이 방정식 역시 그렇게 해를 구하기가 어려운 것은 아니지만, 매트랩을 통해 풀어보자.


이 방정식의 해는 1, 2, 3이라고 solve 함수가 알려주었다. 혹시 의심가시는 분은 손으로 계산해보시면 됩니다.^^

마지막으로 손으로 풀기 정말 귀찮은 방정식을 하나 풀어보자.

 

$z^2 + 3.898z + 1.1794 = 0$

물론 그 유명한 근의 공식을 사용하면 누구든 풀 수 있다. 단지 오래걸릴 뿐. 인간은 도구를 활용할 수 있지 않은가? 매트랩으로 풀어보자. 



왜인지는 잘 모르겠지만, 이런 형태로 해가 출력되었다. 하지만 하나씩 복사해서 그대로 command window에 입력하면, 계산된 결과를 볼 수 있다.

 


결국 이 방정식의 해는 -3.5674, -0.3306임을 알게 되었다.

그리고 간혹 방정식의 해를 위와 같은 방식으로 구했는데 root라는 것이 포함된 어떠한 식으로 표현될 때가 있다.

 

 

당혹스럽다. 그러나 이에 대한 설명을 매트랩 측에서 다음과 같이 해주고 있다. 

 

결론만 말하자면 이런 경우에는 vpa함수를 활용하라는 것이다. 

 

해를 구하고 보니 6개의 해가 모두 복소수였다. (그런데 거의 허수부분은 모두 0에 가깝다. $10^{-38}$, $10^{-39}$이 붙어있기 때문이다.)

 



제가 이해한 것을 바탕으로 설명한 것이기 때문에, 혹시 틀린 부분이 있을수도 있습니다. 그런 부분 있다면, 저에게 한수 가르쳐주시길 부탁드리며 글을 마칩니다.^^

댓글()

[논문 정리] Bosse, "Deep Neural Networks for No-Reference and Full-Reference Image Quality Assessment", TIP(2018)

논문 요약

저자들이 특성 도출을 위해 만든 네트워크는 10층의 컨볼루션 층과 5층의 maxpooling 층으로 구성되어 있다. 그리고 2개의 fully connected 층들이 회귀를 위해 존재한다. 도출된 특성은 로컬 품질과 로컬 가중치의 공동 학습에 사용된다. 그리고 최종적으로 로컬 품질 점수에 가중치를 부여하여 가중합함으로 최종점수를 얻는다. 결합 end-to-end 훈련을 위해 가중합으로 얻어낸 최종점수는 loss function에 활용된다.

 

FR IQA를 위해 제안한 알고리즘 (출처: 해당 논문)

 

 

NR IQA를 위해서는 위 프레임워크에서 Siamese Network 중 reference patch와 관련된 채널을 지운다. 아래 그림을 참고하자. 

 

 

NR IQA를 위해 제안한 알고리즘 (출처: 해당 논문)

 

유익한 내용 정리

저자들은 IQA 알고리즘을 크게 세 부류로 분류했다.

1) bottom-up 접근: HVS의 작동방식을 모델링하는 알고리즘들이 여기에 속한다. 

2) top-down 접근: HVS를 블랙박스로 보고 이미지 통계가 왜곡에 의해 변화한 정도를 캡쳐한다. 특성 도출 후 회귀 분석으로 이어지는 알고리즘들이 여기에 속한다.  

3) data-driven 접근: 특성 도출과 회귀 분석을 딥러닝 알고리즘에 맡긴다. 양질의 데이터가 필수적이다. 

나는 이렇게 분류한 것이 꽤 타당하다고 생각한다. 

댓글()

<하나님의 열심>, 우리를 끝까지 그의 길로 인도하시는

아래 독후감은 2015년 8월 29일에 작성한 것이다.



아브라함, 야곱, 요셉, 욥, 다윗, 엘리야, 베드로 등 굵직한 인물들을 성경에서 만날때 우리는 대단히 존경스러운 마음이 들면서도 기가 죽는다. '과연 나는 저렇게 살 수 있을까? 어떻게 아브라함처럼 믿음으로 아들을 하나님께 바칠 수 있지? 어떻게 요셉처럼 단둘이 있는 장소에서 여인이 대놓고 유혹해오는데 옷을 버려가면서까지 도망갈 수 있지? 욥과 같은 고난의 상황에서도 하나님께 원망하지 않고 찬양할 수 있을까?' 기가 죽는다. 내 모습과 비교해보면 나는 과연 신자인가 싶기도 하다. 

하지만 저자는 그들이 태어날 때부터 그런 존재가 아니었다고 강하게 주장한다. 하나님께서 부족하고 연약한 그들을 기다려주시고 훈련시키시고 간섭하셔서 훌륭한 신앙인의 모습으로 성장시켜 갔다는 것이다. 우리는 선입관을 가지고 성경의 인물들을 대할 때가 많다. '아브라함은 원래부터 위인이었으니까 그렇게 할 수 있어. 다윗이니까 그렇게 할 수 있지.' 그런데 저자의 주장을 보고 인물들의 삶을 자세히 살펴보면 이상하게도 흠이 많다. 아브라함이 자신의 아내를 누이라고 속인 사건, 다윗의 밧세바 간음, 그의 남편 우리아 살인 사건, 베드로가 세번 예수님을 부인한 사건, 엘리야가 이세벨이 두려워서 로뎀나무 아래로 피신한 사건 등 선입견을 버리고 살펴보면 꽤 나와 비슷한 구석들이 있다. 이러한 증거들을 종합해보건대 그들은 위인이 아니라 범인(凡人)이었다. 그러나 하나님께서 그들을 훈련시키시고 단련시키셔서 우리가 기억하고 있는 모습으로 성장시키신 것이다. 

그렇기 때문에 우리에게 희망이 있고 소망이 있다. 하나님은 이렇게 말 안듣는 우리들을 온전한 모습으로 계속해서 성장시켜 가실 것이다. 하나님께서 열심히 포기하지 않고 혼내서라도 인도해가실 것이다. 하나님의 자녀로 나를 불러주셨기 때문이다. 

댓글()