저는 MATLAB을 비롯하여 다양한 컴퓨터 언어들을 사용하는 것을 좋아하는데 ~ 최근에는 회사에서 실험 데이터를 다루는 과정에서 파이썬을 많이 사용하고 있고 그 중에서 많은 분들이 아실 만한 pandas 라이브러리를 사용하고 있습니다 . 파이썬은 공짜이기도 하지만 pandas 를 비롯한 정말 좋은 라이브러리들이 많아서 앞으로도 꾸준히 사용하게 될 것 같습니다.

실험 데이터들은 많은 경우 엑셀이나 csv 파일 형태로 저장을 하게 되는데, MATLAB에서 xlsread, csvread 와 같은 함수를 통해 이런 데이터들을 불러오게 되고 MATLAB cell 타입에 대해서 다루어야 되는 경우가 종종 있습니다.

셀 타입으로 된 데이터 중 중복되는 내용을 제거하거나~ 유일한 데이터만 추려해야 되는 경우가 종종 발생하게 되는데 오늘은 이에 대해서 소개를 해 보려 합니다.

셀 데이터 중에서 유일한 데이터만 선택하는 것은 정말 간단한데 ~ 아래 포스팅에서도 소개했던 unique() 함수를 사용하시면 되겠습니다.

https://iamaman.tistory.com/269

그리고 위 포스팅에서 사용한 unique, setdiff 함수를 사용하면 ~ 중복되는 내용 역시도 추려 낼 수가 있습니다.

아래와 같이 A 라고 하는 중복되는 내용을 가지고 있는 셀을 준비하고 uniqueDup 함수에 넣어보면~ 유니크한 값이 들어있는 uniqueCell 와 중복된 값이 들어있는 dups 변수를 얻을 수 있습니다.



사인 코사인을 비롯해서 많은 주기 함수들이 있고 가끔씩은 MATLAB 을 사용하여 사용자 지정 주기 함수를 만들어야 되는 경우도 있습니다.

이러한 경우 주기를 만들기 위해서 MATLAB 함수중 나머지를 계산하는 mod(), rem() 과 같은 함수를 사용하게 되는데~ 둘 다 나머지를 계산하는 함수이지만 음수에 있어서 약간 계산이 다르게 됩니다.

다음 예를 보면 차이점을 정확히 알 수 있는데~ mod() 함수는 modulo 연산을 하기 때문에 음수 부분에서도 주기적으로 나오는 반면에 rem() 함수는 플러스 방향끼리 그리고 마이너스 방향 끼리만 주기적인 것을 확인할 수 있습니다.


f = @(t) mod(t, 4);

figure

fplot(f, [-10 10])

title('mod')

figure

f2 = @(t) rem(t, 4);

fplot(f2, [-10 10])

title('rem')

따라서 전체 x 구간에 대해서 주기적인 함수를 만들기 위해서는 mod() 함수를 사용해야 함을 알 수 있습니다.

물론 mod(t, P) 함수의 경우 0 부터 P 까지에 대해 주기성을 나타내는 함수를 만드는 것이므로 만약 함수의 정의가 -2 ~ +2 등과 같이 음수 축을 포함하는 주기함수의 경우 축을 0~4 의 범위로 변한 해 준 후에 사용하시면 될 것입니다.



최근에 매트랩 브러시 기능을 자주 사용하고 있습니다. 그래프를 그리고 유효한 데이터를 선택하기 위해서 아래 포스팅에서 소개를 했었던 브러시, 데이터 커서 기능을 굉장히 많이 사용하고 있고 브러시 된 데이터들을 변수를 저장하여 MATLAB 워크스페이스에서 가공을 하고 유효한 데이터들을 얻는 작업들을 수행하곤 합니다.

https://iamaman.tistory.com/2830

위 포스팅에서 브러쉬 된 데이터들을 “변수 만들기” 를 통해서 변수로 저장할 수 있다는 것을 소개한 적이 있었는데~ MATLAB 에서는 조금 더 다양한 방법으로 brush 된 데이터들에 접근할 수 있었습니다.

일단 아래와 같이 그래프를 하나 그리고~ brush on 을 해 줍니다~

x=1:10

p = plot(x)

brush on

Figure 창에서 데이터들을 선택한 후에~ 보통은 오른쪽 클릭을 해서 “변수 만들기” 를 하지만 아래와 같은 명령을 통해서도 brush 된 데이터를 변수로 만들 수 있습니다.

일단 브러시 된 데이터들의 인덱스는 아래 명령어를 통해서 확인할 수 있습니다.

ind = find(get(p, 'BrushData'));

다음으로 인덱스에 따른 X, Y 좌표의 값들은 아래와 같은 명령어를 통해 변수로 만들 수 있습니다.

brush = logical(get(p, 'BrushData'))

xd = get(p, 'XData')

yd = get(p, 'YData')

brushed_x = xd(brush)

brushed_y = yd(brush)

brushed_x, brushed_y 변수를 확인해 보면 브러쉬 된 데이터가 저장 된 것을 확인할 수 있고~ 만약 3차원 그래프라면 z 축의 값도 동일한 방식으로 구할 수 있습니다.

위 코드에서 plot 핸들을 p 라는 변수로 받아서 사용을 했는데~ plot 은 axes 의 Children 입니다. 따라서 아래와 같이 gca 의 ‘Children’ 속성을 통해서도 똑같이 plot 핸들을 구할 수 있습니다.

p = get(gca, 'Children')

gca 키워드에 대해서는 아래 포스팅을 참조하시기 바랍니다.

https://iamaman.tistory.com/174

추가적으로~ 제가 많이 참고 하는 사이트로 “Undocumented Matlab” 이라는 사이트가 있는데~ MATLAB 을 조금 더 파워풀하게 사용하고자 하시는 분들은 아래 사이트에 방문해 보시기 바랍니다.

https://undocumentedmatlab.com

MATLAB brush 데이터에 접근하는 다양한 방법들은 아래 포스팅을 통해서도 확인할 수 있습니다.

https://undocumentedmatlab.com/blog/accessing-plot-brushed-data

그리고 위 포스팅 내용 중 uiinspect 라고 하는 괜찮은 유틸을 확인할 수 있었는데~ 해당 유틸은 아래 주소의 File Exchange 사이트를 통해 다운로드 받을 수 있습니다.

https://kr.mathworks.com/matlabcentral/fileexchange/17935-uiinspect-display-methods-properties-callbacks-of-an-object



MATLAB 을 사용하여 알고리즘을 개발하고 분석하면서 MATLAB 의 다양한 그래프 기능을 사용하실 것이라고 생각합니다. 10 년도 전에 MATLAB 을 학부 시절에 접하고, MATLAB 의 그래프 기능들이 정말 유용하다는 생각을 했던 기억이 있습니다.

오늘은 MATLAB 을 사용하여 그래프의 영역을 나타내는 방법에 대해서 조금 소개를 하려 합니다.

예를 들어 아래 두 그래프로 둘러싸인 영역을 표시하고 싶을 때 MATLAB으로 어떻게 표현해야 되는지에 대해서 소개를 하려 합니다.

y = x+3

y = 2*x-6

위 두개의 그래프로 둘러싸인 영역을 표시하는 간단한 코드는 아래와 같습니다. 아래 코드에서 설명할 부분은 x_, y_ 를 설정하는 부분과 fill() 이라는 함수에 대한 부분이 될 거 같은데~ fill 함수는 이름에서도 알 수 있듯이 다각형 내부의 색을 채워주는 함수입니다. fill 함수가 다각형의 좌표값을 필요로 하다 보니 x_, y_ 값을 아래와 같이 표현해서 닫힌 형태의 다각형으로 만들어 준 것이고 마지막 인자인 ‘r’ 은 red 즉 빨간색으로 표시하라는 뜻입니다.

x=linspace(-10,30,1001);

y1 = x+3;

y2 = 2*x-6;

x_=[x fliplr(x)];

y_= [y1 fliplr(y2)];

figure

fill(x_, y_, 'r')

grid on

그래프는 아래와 같이 표현됩니다.

fill 함수와 유사한 함수로 patch 함수가 있고~ patch 함수는 하나 이상의 채워진 다각형을 만들어 주는 함수입니다. 다각형 한개를 그릴때는 사실 동일하다고 볼 수도 있을 것 같네요. 위 코드에서 fill 을 patch 로 바꿔도 동일한 결과를 얻을 수 있습니다.

fill, patch 함수가 다각형 내부의 색을 채워주는 함수이다 보니 x_, y_ 와 같은 변수들을 만들어서 사용했는데~ 조금 더 쉽게 영역을 표시하는 함수로 area 함수를 사용할 수가 있습니다. 아래 메뉴얼에도 나와 있지만 2차원 그래프에서 그래프 선과 basevalue 로 둘러싸인 부분의 영역을 표시해주는 함수입니다. basevalue 의 디폴트 값은 0 입니다.

https://kr.mathworks.com/help/matlab/ref/area.html?searchHighlight=area&s_tid=doc_srchtitle

area 함수를 사용한 코드는 아래와 같습니다.

x=linspace(-10,30,1001);

y1 = x+3;

y2 = 2*x-6;

x=x(:);

y=[y1(:) y2(:)];

figure

h = area(x, y);

grid on

코드를 표현하는 것은 조금 더 쉬운 듯한데…. 그래프를 확인해 보면 의도와는 뭔가 조금 다른 것 같습니다. 즉 원하지 않는 파란색 영역도 나타낸 것을 확인할 수 있습니다.

파란색 영역을 없애기 위해서 조금 더 코드를 추가해야 될 것입니다. 파란색 영역을 투명하게 만들기 위해서 해당 부분의 색깔을 흰색으로 만들어 준 후에~ alpha 함수를 사용하여 투명도를 조절해 줬습니다~

h(2).FaceColor = [1 0 0];

h(1).FaceColor = [1 1 1];

alpha(h(1),0.1)

이렇게 해서 나타나는 그래프를 보면~ 아래와 같이 원하는 영역만 표시된 그래프를 얻을 수가 있습니다~



이 포스팅을 보시는 분들이라면 다들 아시겠지만 MATLAB 의 그래픽 표현 능력은 정말 뛰어난 편입니다. 신호 처리를 비롯해서 많은 분야에서 그래프를 사용하고 있고~ 그런 의미에서 MATLAB 은 정말 큰 장점이 있는 툴 인 것 같습니다.

MATLAB 에서 하나의 Figure 창에 다양한 그래프를 나타내기 위해서 아래 포스팅에서 소개했던~ subplot 과 같은 함수를 사용하곤 하는데~

https://iamaman.tistory.com/101

오늘은 axis 를 사용하여 그래프 안에 조그맣게 또 다른 그래프를 그리는 방법에 대해서 소개를 하려 합니다.

샘플 코드는 아래와 같습니다.

그래프 안에 조그만 또 다른 그래프를 그리기 위해서~ axes() 함수를 사용하여 작은 그래프가 들어갈 위치를 잡아주고~ 바깥에 있는 큰 그래프와 구분해 주기위해 box on 을 했습니다.

이후에 그래프를 그리면 아래 그림과 같이 그래프 안에 또 다른 작은 그래프가 들어가는 것을 확인할 수가 있습니다.



MATLAB 을 사용하다 보면 struct 타입을 종종 사용하곤 합니다. 그리고 struct 타입을 모아서 배열로도 사용하곤 하는데 MATLAB 기본 함수중에 struct 타입 배열을 정렬하는 기능의 함수는 없는것 같더군요.

그냥 만들어 사용해도 되겠지만 검색을 조금 해보니 비슷한 코드를 발견했고 해당 코드를 정리해서 아래와 같은 함수로 만들었습니다.




이제 함수를 만들었으니 한번 사용해 보죠.

a = struct('id',1, 'data', [1:10])

b = struct('id',2, 'data', [2:11])

beforeVec= [b a]; % 두 struct 를 사용하여 배열로 만듬

sortedVec = struct_sort_by_field(beforeVec,1,1); % 첫번째 field 의 첫번째 인덱스 값에 대해 정렬

beforeVec.id % 기존 배열의 인덱스 확인

sortedVec.id % 정렬된 배열의 인덱스 확인

위 결과를 보면~ sortedVec 는 id 값에 따라 오름차순으로 정렬 된 것을 확인 할 수 있습니다.



많은 분들이 MATLAB을 사용하여 데이터 처리를 할 것이라고 생각을 합니다. 사실 MATLAB을 사용할 수 있는 분야는 너무나 무궁무진해서 저도 다 알지는 못 하고 저는 회사에서 신호 처리를 하고 있는데 데이터를 가공하기 위해서 MATLAB 을 주로 사용하는 편입니다.

아래 포스팅에서 소개를 했었지만 매트랩 그래프를 보면서 데이터를 선택하고 값을 읽고 텍스트를 입력하거나 다양한 효과를 줄 수가 있습니다.

https://iamaman.tistory.com/204

오늘은 그 중에서 데이터 커서를 사용하여 그래프에서 값을 읽거나 브러시 기능을 사용하여 많은 데이터들을 선택하는 방법에 대해서 살펴보려 합니다.

다음과 같은 코드를 준비하고 그래프를 하나 드려 보겠습니다.

x=[ones(1,100)*2 ones(1,100)*10 ones(1,100)*20];

xx=x+rand(size(x));

plot(xx), grid on

위 코드를 실행하면 아래와 같은 그래프 하나가 뜨게 될 겁니다.

그래프에서 데이터 커서 기능 사용하기

그래프를 보면서 특정 부분의 데이터를 알고 싶은 경우가 있습니다. 그런 경우에는 Figure 창의 데이터 커서 기능을 사용 합니다.

데이터의 값을 보고 싶은 경우에는 아래와 같이 십자가 모양 버튼의 아이콘을 클릭해 줘도 되고 ~ 메뉴에서 “툴(T) -> 데이터 커서(A)” 를 선택해도 됩니다.

데이터 커서를 눌러준 후에 커서가 십자가 모양으로 변하고 원하는 데이터 지점을 선택하면 아래와 같이 해당 부분의 데이터값이 나타나게 됩니다. 여러 데이터를 찍고 싶으면 Shift 를 누른 상태에서 왼쪽 클릭을 해 주면 아래와 같이 복수의 데이터를 선택할 수도 있습니다. 이렇게 선택을 한 후에 오른쪽 클릭을 하면 해당 데이터와 관련된 툴팁 메뉴가 나오고 원하는 기능을 선택 할 수가 있습니다.

저는 주로 데이터를 삭제하거나 새 데이터를 만들기보다는 “커서 데이터를 작업 공간으로 내보내기” 기능을 주로 사용합니다. “커서 데이터를 작업 공간으로 내보내기” 버튼을 누르면 변수 이름을 입력할 수 있는 창이 하나 뜨게 되고 데이터 커서를 사용하여 선택한 데이터들을 MATLAB 워크스페이스에 저장 하고 다양한 계산에 활용할 수 있습니다.

그래프에서 브러시 기능 사용하기

데이터 커서는 데이터의 값을 보는데 주로 사용을 하지만 브러시 기능은 마우스로 다량의 데이터를 선택해서 편집하는데 주로 사용하곤 합니다. 브러시 기능 역시 마찬가지로 아이콘을 클릭하거나 메뉴에서 “툴(T) -> 브러시(B)” 를 선택하면 됩니다.

브러시는 기본적으로 빨간색이 선택되어 있는데 브러시 아이콘 옆에 있는 아래쪽 화살표를 누르면 브러시 색깔을 선택할 수 있습니다.

브러시 기능을 실행 하고 아래와 같이 원하는 부분을 드래그해서 선택해주면 ~ 원하는 데이터 부분들을 선택할 수 있습니다. 데이터 커서 기능과 마찬가지로 오른쪽 버튼 클릭하면 추가적인 기능을 사용할 수 있고 “변수 만들기” 버튼을 누르면 데이터 커서에서와 마찬가지로 MATLAB 워크스페이스에 데이터를 저장할 수도 있습니다.

위 메뉴에서 확인할 수 있는 바와 같이 선택된 데이터들에 대하여 일괄적으로 특정값으로 바꾸거나 제거하는 등 편리하게 데이터를 조작할 수 있습니다.

아래 포스팅들에서 소개를 했었던 tiobe 에 접속을 해 보니 요즘도 계속해서 MATLAB 의 인기가 상승 중이더군요~ 요즘은 11위 까지 올라갔네요~

https://iamaman.tistory.com/85

https://iamaman.tistory.com/1479

https://iamaman.tistory.com/1590

아시는 바와 같이 MATLAB 은 일년에 두번씩 업데이트를 하고 있고 지금도 계속해서 발전하고 있는 프로그램입니다. 많은 분들이 현명하게 MATLAB 을 활용하셨으면 하는 바람입니다.



MATLAB 을 사용하여 신호 처리를 하다 보면 필터를 설계하는 경우가 있고 필터의 게인을 조절해야 되는 경우가 있습니다. 보통 디지털 필터 설계를 할 때는 pass band 의 게인을 1 (0 dB) 로 맞춰 주게 되는데 오늘은 이 방법에 대해서 소개를 하려 합니다.

MATLAB 을 사용하여 필터 설계하고 코드를 생성하거나 모델을 만들때는 fdatool (Filter Design & Analysis Tool) 을 주로 사용하게 되고 필터를 확인하고 싶을때는 fvtool(Filter Visualization Tool) 을 주로 사용합니다.

FIR 필터 계수가 CoeffV 인 경우 MATLAB 명령창에 fvtool(CoeffV,1) 라고 명령하면 아래와 같은 Filter Visualization Tool 이 실행되고 해당 필터 계수에 대한 정보들을 확인 할 수 있습니다.

또한 Analysis -> Analysis Parameters 를 선택하면

아래와 같이 Analysis Parameters 창이 나타나고 “Normalize Magnitude to 1 (0 dB)” 를 체크하고 적용하면

아래와 같이 pass band 의 게인이 1 로 설정이 되는 것을 확인 할 수 있습니다.

그런데 이러한 설정은 실제 값이 바뀌는 것이 아닌 그래프의 형태만 바뀌는 것입니다. 따라서 실제 필터의 게인을 1 (0 dB) 로 설정하기 위해서는 필터의 게인을 알아낸 후 scaling factor 값을 구해서 해당 값으로 필터 Coefficient 를 scaling 해 줘야 합니다. 이러한 작업을 하는 코드는 아래와 같습니다.

[h, w] = freqz(num, den); % frequency response of (num, den)

scale = 1/max(abs(h)); % scaling factor

numScaled = num*scale;

fvtool(numScaled, den) 명령을 통해 해당 필터의 magnitude response 를 확인해 보면 pass band 의 게인이 1 (0 dB) 로 맞춰진 것을 확인 할 수 있습니다.



아래 포스팅에 가우스-뉴턴 방법을 사용하여 원의 방정식의 파라미터들을 찾는 실험을 수행한 적이 있었습니다.

https://iamaman.tistory.com/2759

가우스-뉴턴 방법을 적용한 결과 수렴이 되긴 하지만 초기값 설정에 따라 발산하는 경우가 너무나 많은 걸 확인 할 수 있었습니다. 그래서 이번에는 같은 문제에 대해 Gradient Descent 방법을 적용해 보았습니다. Gradient Descent 방법 적용을 위한 수식은 위 주소의 포스팅과 아래 포스팅을 참조하시기 바라고 원의 방정식에 대한 MATLAB 코드 역시 마찮가지로 위 주소의 포스팅을 참조하시기 바랍니다.

https://iamaman.tistory.com/2760?category=422993

원의 방정식에 대해 Gradient Descent 방식을 적용하여 파라미터를 찾는 코드는 아래와 같습니다.

%% Gradient Descent

XX=X(:);

YY=Y(:);

ramda = 0.05;

x = [-20;-20;-2]; % 초기값

maxIndex = length(XX)-10;


k1=1;

while 1

nn = randi(maxIndex); % random index

Y=YY(nn:(nn+3));

X=XX(nn:(nn+3));

F = sqrt((X-x(1)).^2 + (Y-x(2)).^2)-x(3);

J = [(x(1)-X)./sqrt((X-x(1)).^2 + (Y-x(2)).^2) (x(2)-Y)./sqrt((X-x(1)).^2 + (Y-x(2)).^2) -ones(size(X))];

errV = J'*F;

x = x-2*ramda*J'*F;

if mean(abs(errV))<0.00002

    disp(k1)

break

end

k1=k1+1;

end

k1

x

X 의 초기값은 [-20;-20;-2] 으로 설정했고, Gradient Descent 알고리즘을 위한 step 값은 0.05 로 설정했습니다. error 의 절대값이 0.00002 이하일때 알고리즘을 멈추도록 했고 learning 횟수를 display 하도록 설정했습니다.

learning 횟수는 그때 그때 다르지만 초기값 설정에 따른 발산 정도는 Gauss-Newton 방식에 비해 확실히 덜 한것 같다는 느낌이 들었고 아래 결과와 같이 15698 회 정도 learning 이 된 후에 정상적인 X 값을 찾는 것을 확인 할 수 있었습니다.

k1 =

15698

x =

1.0000

3.0000

3.0000



예전에 학부생 때는 회로이론 과목을 굉장히 좋아했던 기억이 있는데 오랜만에 저항을 보니 적응이 잘 안되더군요. 역시나 간단한 것이라고 해도 배운 것들은 그때그때 기록을 해놓는게 좋은것 같습니다.

오늘 기록하려고 하는 내용은 병렬저항 계산 공식인데 아시는 바와 같이 저항은 직렬 연결 됐을 경우에는 그냥 더하면 되고 병렬로 연결된 경우 아래와 같이 계산이 됩니다.

R1, R2 병렬 연결

R1, R2, R3 병렬 연결

R1, R2, R3, R4 병렬 연결

R1, R2, R3, R4, R5 병렬 연결

MATLAB 에서 병렬 저항을 조금더 편리하게 계산하기 위해 병렬 저항을 계산하는 MATLAB 코드를 작성했고 아래와 같습니다. 임의의 숫자의 아규먼트에 대해서 처리하기 위하여 아래의 포스팅에서 소개를 했던 varargin 을 사용했습니다.

http://iamaman.tistory.com/372

병렬저항 값을 계산하는 ParallelResistance 함수는 MATLAB 명령창에서 아래와 같이 사용하면 됩니다.

>> ParallelResistance(1,2,7,8)

ans =

0.5657



최근에 개인적인 필요에 의해 nonlinear regression 을 접하고 있는데 아래 포스팅을 보면서 개념을 잡아가고 있습니다.

http://darkpgmr.tistory.com/58

nonlinear regression 알고리즘 중 유명한 것이 Levenberg-Marquardt 라고 하는데 Levenberg-Marquardt 알고리즘은 gradient descent 와 Gauss–Newton 방법이 합쳐진 형태라고 하더군요. 그래서 일단 gradient descent 는 아니까 Gauss–Newton 방법이 무엇인지에 대해 공부를 하기 위해 검색을 하던 중 위 블로그를 발견하게 되었고 백문이 불여일타라고 일단 코딩해 봐야 이해가 되니까 위 포스팅에서 맨 아래 있던 예제를 MATLAB 으로 돌려 봤습니다.

예제는 원 방정식에 대해 가우스-뉴턴 방법을 적용해서 파라미터를 찾는 것입니다.

원의 중심과 반지름을 a, b, r 이라고 하고 이를 벡터로 표현하면 x=[a; b; r] 입니다.

원의 방정식(F)는 아시는 바와 같이 아래 수식과 같고~ 아래 수식에서 대문자 X 와 소문자 x 가 다르다는것을 염두에 두시기 바랍니다…. 다른 문자로 쓸걸 그랬나…. ??

위 수식에 대하여 변수 a, b, r 에 대한 자코비안(J)는 아래와 같습니다.

Gauss–Newton 업데이트 수식은 아래와 같습니다. 아래 수식에서 ‘ 는 Transpose 를 의미 하고 inv() 함수는 matrix inverse 함수입니다.

x = x - inv(J(x)' * J(x))*J(x)'*F(x)

MATLAB 에서 inv 함수를 사용하는것 보다는 역슬래쉬(\) 를 사용하는게 더 추천하는 방식이기 때문에 위 수식은 아래와 같이 구현 했습니다.

x = x - (J(x)' * J(x))\J(x)'*F(x)


반지름이 3 이고 중심이 (x,y) = (1,3) 인 원의 방정식을 하나 만들었고 제가 작성한 MATLAB 코드는 아래와 같습니다.

NOP = 100;

center = [1,3];

radius = 3;

style='b-';

THETA=linspace(0,2*pi,NOP);

RHO=ones(1,NOP)*radius;

[X,Y] = pol2cart(THETA,RHO);

X=X+center(1);

Y=Y+center(2);

H=plot(X,Y,style);

grid on

axis square;

axis equal;

다음으로 해당 원의 방정식에 대해 Gauss–Newton 방정식을 적용하는 코드는 아래와 같습니다.

XX=X(:);

YY=Y(:);

x = [0;1;15];

% 원의 방정식에 대한 가우스-뉴턴 방법

for n=1:60

Y=YY(n:(n+10));

X=XX(n:(n+10));

F = sqrt((X-x(1)).^2 + (Y-x(2)).^2)-x(3);

J = [(x(1)-X)./sqrt((X-x(1)).^2 + (Y-x(2)).^2) (x(2)-Y)./sqrt((X-x(1)).^2 + (Y-x(2)).^2) -ones(size(X))];

x = x - (J' * J)\J'*F;

end

x

위 코드에서는 초기값은 0, 1, 15 로 했고 돌려보니 아래와 같이 원의 중심과 반지름을 정확히 추정함을 확인 할 수 있었습니다.

x =

1.0000

3.0000

3.0000

그런데 다들 아시겠지만 Gauss–Newton 방식은 초기값에 따라 발산의 우려가 있다고 합니다. 저도 실험을 해보니 초기값을 다른 값들로 해서 실험을 많이 하다 보니(ex x = [0;8;15];) 로 한 경우에는 추정값이 발산하더군요.



MATLAB 의 format 명령을 사용하면 명령 창의 출력 표시 형식을 rat, hex, short, long 등으로 변경할 수 있습니다. 공학을 하다보면 숫자를 표현할때 단위에 따라 kilo, giga, mega 등과 같은 단위를 사용하곤 하고 이런 형식으로 바꾸기 위한 방법을 찾아보니 아래 주소에서 괜찮은 코드를 발견해서 소개합니다.

https://kr.mathworks.com/matlabcentral/fileexchange/53886-scientific-prefix-to-number

위 주소에서 다운로드 버튼을 누르면 num2sci.zip 파일을 다운로드 할 수 있고~

num2sci.zip 파일을 압축 해제 한 후에 해당 폴더를 path 에 추가하면 MATLAB 의 아무 디렉토리에서나 사용할 수 있습니다. 폴더를 MATLAB path 에 추가하는 방법은 아래 주소의 글들을 참조하시기 바랍니다.

http://iamaman.tistory.com/1829

http://iamaman.tistory.com/569

http://iamaman.tistory.com/2629

num2sip.m, num2bip.m 함수를 사용할 수 있고 각각 doc num2sip, doc num2bip 이라고 하면 해당 함수에 대한 내용을 보실 수 있습니다.

num2sip 함수는 숫자를 metric prefixed string 으로 변경하는 함수인데 ~ 예를 들어 1000 이라는 숫자를 표현할때는 아시다시피 1 kilo 라고 표현하고 아래와 같이 MATLAB 명령창에 타이핑 하면 됩니다.

>> num2sip(1000)

ans =

1 k

>> num2sip(1e6)

ans =

1 M

num2sip 함수에 대한 설명을 보시면 아시겠지만 아래와 같이 4개 까지 인자를 받을 수 있습니다.

str = num2sip(num, sgf, pfx, trz)

num 은 숫자, sgf 는 표현할 숫자의 자리수, pfx 는 단위의 Full name 으로 할지 Symbol 로 할지 trz 는 자리수를 맞추기 위한 0을 넣을지 말지에 대한 결정입니다.

아래와 같은 예로 사용하시면 됩니다.

>> a=128e6

a =

128000000

>> num2sip(a, [], true, true)

ans =

128.00 mega



Simulink 를 사용하면서 shift register 가 필요한 경우가 종종 있는데 개인적으로는 unit delay 를 사용하여 shift register 를 구성하곤 합니다. 그런데 shift register 의 사이즈가 얼마 안된다면 그냥 노가다로도 만들수 있지만 그 사이즈가 커 진다면 이렇게 일일이 만들어서 사용하는것이 힘들더군요. 그래서 오늘은 unit delay 를 사용한 shift register 를 자동으로 만들어주는 스크립트를 소개하려 합니다.


shiftRegisterGeneration 함수를 만들었고 코드는 아래와 같습니다.



아래 명령어는 shiftRegisterGeneration 함수를 사용하여 15 사이즈의 shift register 를 만드는 명령어 입니다. MATLAB Command Window 에서 아래 명령을 실행하면

shiftRegisterGeneration(15)

아래와 같이 ShiftRegister15 라는 이름의 subsystem 이 만들어 지고~

해당 subsystem 을 들어가 보면 아래와 같이 unit delay 로 구성된 shift register 가 만들어 집니다.



MATLAB 은 일종의 소프트웨어 플랫폼이라고 볼 수가 있어서 매트랩 툴박스들은 MATLAB 위에서만 실행됩니다. 따라서 시뮬링크를 사용한다라고 해도 매트랩을 잘 다루어야 시뮬링크를 조금 더 효율적으로 사용할 수 있습니다.

요즘 저는 많은 차량용 로직들을 Simulink Stateflow 로 설계하고 Embedded Coder 를 사용하여 C 코드를 생성해서 개발 보드에 탑재하는 업무를 하고 있습니다. Simulink 를 사용하기 위해서는 샘플레이트를 비롯하여 다양한 configuration 을 하게 되고~ Embedded Coder 를 사용할 때 역시도 마찬가지로 설정 할 것들이 많이 있습니다.

이런 설정들은 그때그때 달라지기도 하지만 사용하는 MCU 가 동일하다면 그리 크게 달라지지는 않습니다. 따라서 한번만 설정하고 해당 설정을 저장해 놓고 사용하는 것이 효율적일 것입니다.

오늘은 MATLAB 스크립트를 사용하여 Simulink configuration 을 하는 방법을 소개하려 합니다. Simulink configuration은 Simulink 모델창에서 Simulation -> Model Configuration Parameters 를 선택하거나 Ctrl + E 를 누르면 실행 됩니다.

그 중에서 아래와 같이 All Parameters 탭에서 메뉴들을 검색 할 수 있는데~ 아래 그림과 같이 해당 메뉴에 대한 Command-Line Name 을 확인 할 수 있습니다. Simulink configuration 내용을 스크립트로 자동화 하고 싶은 경우에 Command-Line Name을 사용하면 됩니다.

Simulink 모델의 기본적인 설정값들은 아래 주소의 메뉴얼을 확인해 보시기 바랍니다.

https://kr.mathworks.com/help/simulink/slref/model-parameters.html

Embedded Coder 를 사용하여 코드 생성을 하기 위해서는 Simulink Solver 셋팅을 Fixed-step discrete (no continuous states) 로 설정하게 되는데~

해당 설정을 하기 위해서는 아래와 같이 명령어를 써주면 됩니다.

set_param(gcs, 'Solver', 'FixedStepDiscrete')

Code Generation 시 Embedded Coder 를 사용하기 위해서는 System target file 설정을 ert.tlc 로 하게 되는데~

이러한 과정을 MATLAB code 로 어떻게 설정하는지를 확인하기 위해서는 아래와 같이

“All Parameters” 에서 “target file” 등으로 검색을 해서 “Command-Line Name” 을 알아 낸 후에 설정해 주면 됩니다.

예로 든 Embedded Coder 를 사용하기 위한 설정은 아래와 같습니다.

set_param(gcs, 'SystemTargetFile', 'ert.tlc')

해당 MATLAB 명령어 설정을 해 본 후에 Simulink configuration 창을 확인 해보면 해당 설정들이 바뀐 것을 확인 할 수 있습니다.



신호 처리 업무를 하면서 가끔씩은 디지털 필터가 필요한 경우가 있습니다. 저도 최근에 DC 성분을 제거하는 DC 제거 필터가 필요해서 검색을 해보니 아래 주소에서 굉장히 좋은 글을 발견할 수 있었습니다.

DC 제거 필터 관련 읽어볼만한 글

https://www.embedded.com/design/configurable-systems/4007653/DSP-Tricks-DC-Removal

위 링크의 글에서 확인할 수 있는 바와 같이 가장 기본적인 DC 제거 필터의 시간 도메인 수식은 아래와 같습니다.

DC 제거 필터 수식

x[n] - x[n-1] = y[n] – a* y[n-1], a < 0

DC 제거 필터의 zero 가 1 이 됨으로서 DC 에 무한대의 attenuation 을 주게 되고 a 값이 1 에 가까워 질수록 notch 의 기울기가 증가하게 됩니다.

numerator [1 -1], denominator [1 -0.95] 인 경우의 DC 필터에 대해 MATLAB을 사용하여 알아보면~

freqz 명령어를 통해 Frequency response 를 확인할 수 있고 명령어는 아래와 같습니다.

freqz([1 -1], [1 -0.95],512,1000)

zero-pole plot 을 확인하기 위해스는 zplane 명령어를 사용하고 아래와 같이 확인 할 수 있습니다.

zplane([1 -1], [1 -0.95])

Impulse response 에 대해 확인하기 위해서는 impz 함수를 사용하고 아래 예와 같이 사용합니다.

impz([1 -1], [1 -0.95])

디지털 필터 관련 참고 자료들

IIR Filter 관련 읽어볼만한 글

http://www.eas.uccs.edu/~mwickert/ece2610/lecture_notes/ece2610_chap8.pdf

Lecture Notes

http://www.eas.uccs.edu/~mwickert/ece2610/lecture_notes/

DC 필터 이외의 다양한 필터들에 대한 수식들

저주파 통과 필터

y[k] = a*y[k-1]+(1-a)*x[k],  a < 0

고주파 통과 필터

y[k] = -a*y[k-1]+(1-a)*x[k], a < 0

평균 필터

y[k] = [(k-1)/k]*y[k-1]+(1/k)*x[k]

N 이동평균 필터

y[k] = y[k-1] + (x[k]-x[k-N])/N



Simulink 를 사용하다보면 다양한 subsystem 을 사용하게 되고 이에 대해 공부하고 싶다면 메뉴얼 또는 demo 파일들을 확인하는 것이 좋습니다. 이를 위해 MATLAB 에는 명령어를 제공해 주는데 MATLAB command line 에 sl_subsys_semantics 이라고 명령하면 아래와 같은 Subsystem Semantics Simulink 창을 확인 할 수 있습니다. Simulink Library Browser 에서 subsystem 으로 검색을 해서 "Subsystem Examples" 라고 되어 있는 라이브러리를 확인해도 됩니다.

Simulink 에는 아래와 같이 9 개의 subsystem 이 있는 것을 확인 할 수 있고 내역은 아래와 같습니다.

lf and switch-case action subsystems, Triggered subsystems, Resettable subsystems, While subsystems, Function-call subsystems, Enabled with trigger subsystems, Enabled subsystems, For Each subsystems, For subsystems

그 중에 자신이 궁금한 subsystem 을 클릭하고 들어가면 이미 만들어진 다양한 예를 볼 수가 있고 직접 실행시키면서 해당 subsystem 에 대해 이해를 할 수가 있습니다. 아래 그림은 Function-call subsystems 의 다양한 예입니다.

초록색은 정상적인 예이고 빨간색은 잘못 사용된 경우에 대한 예이니 참조하시기 바랍니다. 각 블록을 들어가시면 아래와 같이 구체적인 모델을 확인 할 수 있습니다.



요즘 자동차 분야에서 제어기를 설계할때 MATLAB 의 Simulink 제품을 많이들 사용합니다. 제어기 사양서는 state machine 으로 구성되기 때문에 주로 Stateflow 를 사용하여 설계되고 Embedded Coder 등을 사용하면 시뮬레이션 후에 코드 생성까지 되기 때문에 기존에 시뮬레이션 후 C 코드를 다시 작성하고 하는 번거로움을 줄일 수 있습니다.

저도 회사에서 과제를 하면서 MATLAB 으로 알고리즘 시뮬레이션을 하고 Embedded Coder 를 사용하여 C 코드를 생성해서 사용한 경험이 있고~ 나름 신뢰할만한 코드가 나와서 편리하다는 생각을 많이 합니다.

그래서 일단 오늘은 Simulink 를 시작하는 방법에 대해 소개하려 합니다.

1. Simulink 실행

Simulink 를 사용하기 위해서는 당연히 MATLAB 과 Simulink가 설치되어 있어야 겠고 MATLAB 명령창에서 simulink 라고 명령하면 Simulink Start Page 가 나오게 됩니다. MATLAB 은 대소문자를 구별하므로 소문자로 명령어를 입력하시기 바랍니다. 물론 요즘은 툴이 좋아져서 정정 제안도 해주기 때문에 실수를 해도 별 문제가 없습니다.

위 소개처럼 명령어를 사용하는 방법 말고도 UI 를 클릭해서 실행하는 방법이 있는데 아래 그림과 같이 Simulink 버튼을 클릭해 주면 마찮가지로 Simulink Start Page 가 나오게 됩니다.

2. 어떤 어플을 설계 하느냐에 따라 다양한 방식으로 새 프로젝트를 시작할 수 있는데 저는 그냥 예전 스타일로 보통 Blank Model 로 시작하는 편입니다.

이렇게 Blank Model 을 만들었으면 이제 Simulink Library Browser 를 열어서 각 구성 요소들을 가져다 사용하면 됩니다. Simulink Library Browser 를 열기 위해서는 아래 그림과 같이 View -> Library Browser 를 클릭하거나 Ctrl+Shift+L 단축키를 눌러주거나 또는 MATLAB 명령창에 slLibraryBrowser 라는 명령어를 타이핑 해도 됩니다.

3. Simulink Library Browser 에서 사용하고자 하는 Block 들을 찾아서 배치해야 되는데~ 목록을 하나 하나 클릭하면서 어떤 Block 이 있는지를 확인하고 배치 할 수도 있고 블록의 대략적인 이름을 아는 경우에는 아래와 같이 검색을 통해 블록을 선택할 수도 있습니다.

위와 같이 Simulink Library Browser 에서 검색을 통해 모델을 일일이 찾아서 Drag & Drop 해서 붙이는 경우 노력이 많이 들기 때문에 Simulink 모델링에 익숙하신 분들은~

아래와 같이 model 창에서 블록을 놓고 싶은 위치를 클릭한 후에 블록명을 타이핑 하면 해당 이름의 블록 목록이 나오고

클릭하면 바로 모델창에 해당 블록이 입력 됩니다.

지금까지 수동으로 Simulink 시작하는 방법에 대해 소개를 했는데 ~ MATLAB 제품들은 굉장히 많은 부분들을 자동화 할 수 있는 방법들을 제공해 줍니다. 아래 포스팅에서 소개한 바와 같이 MATLAB 코드를 사용하여 Simulink 모델링을 자동화 할 수 있습니다.

http://iamaman.tistory.com/1482

Simulink 를 조금더 편리하게 사용하기 위해서는 이러한 자동화 방법에 대해 공부를 해 보시는 것도 좋을 것 같네요.



MATLAB 에 경로를 추가하기 위해서는 주로 addpath 함수를 사용하거나 아니면 pathtool 을 사용합니다. pathtool 에서 아래 그림과 같이 하위폴더와 함께 추가하기를 통해 특정 폴더와 그 하위 폴더 모두를 path 로 추가 할 수 있습니다.

그런데 pathtool 이 아닌 명령어를 통해 하위 폴더와 함께 추가하기를 하는 방법도 있습니다.

이런 경우에는 addpath 라는 명령어를 사용하는데 addpath() 함수의 사용방법은 그냥 아래와 같이 해 주시면 되서 사실 설명할게 없습니다.

addpath(‘폴더 경로’)

하위 폴더와 함께 추가하기를 하기 위해서는 당연히 하위 경로를 알아야 하고 ~

특정 폴더에 대한 하위 폴더를 알기 위해서는 genpath 라는 명령어를 사용 할 수 있습니다.

genpath 의 매뉴얼은 아래 주소에서 확인 할 수 있습니다.

https://kr.mathworks.com/help/matlab/ref/genpath.html

아래와 같은 폴더 구조로 된 D:\workspace\2018-10-08 폴더에 대해

genpath 를 해 보면~ 이렇게 해당 폴더 포함 하위 폴더가 세미콜론(;) 으로 구분되어 나오는 것을 알 수 있습니다.

따라서 MATLAB Command Window 에서 하위 폴더를 포함하여 경로를 추가하고 싶은 경우에는 아래와 같이 해 주시면 됩니다.

addpath(genpath(‘최상위 폴더 경로’))



회사에서 MATLAB 을 사용하는데 ver 명령어를 통해 어떤 툴박스가 설치되어 있는지 확인해 보니~ Simscape 툴박스가 설치되어 있더군요. Simscape 와 함께 Simscape Electronics, Simscape Power Systems 도 함께 깔려 있던데 저는 정확히 어떤 차이인지는 잘 모르겠더군요.

어쨌든 학부때 회로이론, 전자회로와 같은 과목을 좋아했던 지라 기왕 깔려 있는거 Simscape 를 한번 사용해 보고 싶다는 생각이 들어서 아래 메뉴얼을 조금 들여다 보고 Simscape 블록으로 아주 간단한 RC 회로를 구성해 봤습니다.

https://kr.mathworks.com/help/physmod/simscape/gs/essential-steps-for-constructing-a-physical-model.html

일단 ssc_new 라고 명령하면 Simscape 를 사용하기 위한 기본적인 configuration 이 설정되는 것 같더군요. 아래와 같이 기본적인 블록이 추가된 형태로 model 파일이 열립니다.

그럼 이제 왼쪽에 있는 Simscape Library 중에서 필요한 블록들을 선택해서 model 파일을 구성하면 되겠네요~

위 모델 파일의 블록 중 PS-Simulink Converter, Simulink-PS Converter 블록은 Simulink 의 블록과 Simscape 블록간에 데이터를 전달하기 위한 블록으로 보입니다.

저는 Simscape 초심자라 간단하게 아래와 같이 RC 회로를 구성해 봤습니다.

전류와 전압값 확인을 위해 Current Sensor 는 직렬로 Voltage Sensor 는 병렬로 연결해 줬고~ 데이터를 Scope 에서 확인하기 위해 PS-Simulink Converter 를 통해 Scope 와 연결 했습니다.

Ctrl + S 를 눌러서 model 파일을 저장하고~ 실행을 해 보니 다음과 같이 전류, 전압 값을 확인 할 수 있었습니다.

그냥 간단하게 해 본거긴 하지만 대충 어떻게 사용하는건지에 대한 감은 오네요. 위 Simscape 관련 tutorial 링크를 좀 더 정독하면서 공부를 한번 해 봐야 겠습니다.

혹시 필요하신 분이 있을까봐 위에 구성했던 모델 파일도 올립니다.

simscapetest2.slx



MATLAB 에디터에서 코드를 작성하고 해당 코드에 대해서 문서를 생성할때 MATLAB 에디터의 퍼블리시 기능을 사용하곤 합니다. MATLAB 퍼블리시에서는 코드에 대해서 html, xml, latex, doc, ppt, pdf 등으로 문서를 생성해 줍니다. 퍼블리시 창에서 작업 폴더나 몇몇 옵션 등을 변경해 줄 수 있지만 사용 방법은 그냥 버튼 하나만 누르면 되기 때문에 뭐 그리 설명할게 없을 것 같습니다.

MATLAB Command Window 에서 문서를 생성하기 위해서는 아래와 같이 publish 명령어를 사용하면 됩니다. 첫 번째 인자로 파일명을 넣어 주고 두 번째 인자로 생성 하고자 하는 문서의 형태를 넣어주면 됩니다.

publish(‘publishTest.m’, ’doc’);

그런데 이렇게 간단한 문서 생성 방법도 코드가 잘못된 경우에는 생성이 잘 안 되는 경우가 있습니다.

바로 아래의 코드 예와 같이 루프문 안에 %% 기호로 된 섹션이 있는 경우에는 문서 생성이 굉장히 오래 걸리는 것을 볼 수가 있었습니다. 따라서 문서 생성을 위해서는 코드의 루프문 안에는 %% 기호를 사용해선 안됩니다.

루프 문 안에 있던 %% 섹션 표시를 % 주석으로 처리하고 문서 생성을 하니 정상적인 속도로 문서가 생성 되더군요.

문서 생성 결과를 보면 %% 로 된 섹션 표시는 하나의 챕터를 표시하는 것을 알 수가 있습니다.

For 문 안에 섹션 표시가 있으면 해당 섹션 부분을 문서의 목차에 계속해서 표시하게 될 것이므로 문제가 될 것입니다. 아마도 publish 기능에 루프 문안의 섹션에 대한 예외 처리는 안되어 있는것으로 생각되네요.



예전에는 Visual Studio Express 를 설치해서 MATLAB 에 필요한 C/C++ 컴파일러를 설치 했었지만 최근에는 Mingw 를 설치하면 되더군요.

아래 주소에서 Add-On 을 통해 MinGW-w64 Compiler 설치하는 방법을 소개 했었는데~

http://iamaman.tistory.com/1664

현재 회사 컴퓨터의 MATLAB 라이센스 Software Maintenance 가 유지되고 있지 않아서 Add-On 에서 TDM-GCC 설치를 할수 없게 막아 놨더군요.

아래 주소에서 TDM-GCC 를 설치했고 path 환경변수도 분명 등록을 했는데 MATLAB 에서 mex -setup 이 안 먹어서 어케 하나 하다가~

http://tdm-gcc.tdragon.net/download

아래 주소에서 MATLAB 에 TDM-GCC 를 설치하는 정확한 방법을 찾아서 기록 겸 공유 합니다.

https://stackoverflow.com/questions/39140398/install-mingw-w64-compiler-matlab2013a-or-2016a

1. 위와 같은 방법으로 TDM-GCC 설치후에~

2. 관리자 모드 CMD 에서

setx MW_MINGW64_LOC "C:\TDM-GCC-64" /m

3. MATLAB Command Window 에서

>> setenv('MW_MINGW64_LOC','C:\TDM-GCC-64')

>> mex -setup

MEX이(가) C 언어 컴파일에 'MinGW64 Compiler (C)'을(를) 사용하도록 구성되었습니다.

경고: 2^32-1개의 요소를 초과하는 MATLAB 변수를 지원하기 위해 ...(중략)


% 컴파일러 빌드 확인

>> copyfile(fullfile(matlabroot,'extern','examples','mex','yprime.c'),'.','f')

>> mex yprime.c

'MinGW64 Compiler (C)'(으)로 빌드됩니다.

MEX가 성공적으로 완료되었습니다.

>> yprime(1,1:4)

ans =

2.0000 8.9685 4.0000 -1.0947



많은 공학도 분들이 MATLAB 의 사용법에 대해서 공부하실 거라고 생각합니다. MATLAB 은 아시는 바와 같이 매우 비싼 툴이고 업데이트를 위한 라이센스 유지비용 역시도 1년에 20~30 % 정도를 내는 걸로 알고 있습니다. 저는 학교에서 MATLAB 수업 과목의 조교를 했었고~ 이런 경험을 바탕으로 MATLAB 사용 방법을 소개하기 위해서 본 블로그를 만들었습니다. 개인적으로도 회사에서 MATLAB 을 사용한 업무를 하지만, 일반적으로 학생들이 학교에서 배우는 MATLAB 을 사용한 알고리즘 개발까지는 사실 MATLAB을 사용할 필요가 없다고 생각합니다.

제 블로그에서 소개했었던 Python, Scilab, Octave 를 비롯해서 매틀랩을 대신하여 알고리즘을 개발해 볼 수 있는 오픈소스 또는 프리웨어 소프트웨어들은 정말 많이 있습니다. 그렇다면 매틀랩을 쓸 수 밖에 없는 경우는 무엇이냐라고 한다면 제가 경험한 바로는 C, RTL 등의 코드 생성 분야와 Simulink 나 Stateflow 를 사용한 MBD(Model Based Design) 분야라고 볼 수 있을 것 같습니다. 학교에서는 Python, Octave 를 비롯한 오픈소스 소프트웨어들을 주로 사용하다가 회사에 와서 MATLAB 을 사용해도 늦지 않다고 생각합니다. 또한 MATLAB 만 잘하는 것 보다는 Python 과 같은 언어를 먼저 잘하는게 범용성과 실용주의적인 관점에서 더 낫다고도 생각합니다.

저는 요즘 아래 주소의 인프런(inflearn) 이라는 사이트에서 딥러닝 관련된 강좌를 보고 있는데 최근에 들어가보니 MATLAB 강좌도 있더군요.

https://www.inflearn.com

‘MATLAB으로 시작하는 프로그래밍’ 이라는 강좌이고 MATLAB 을 처음 접하시는 분들에게 유용할 강좌인것 같습니다. 비용도 무료이므로 부담없이 수강하실 수 있을 것 같습니다.

https://www.inflearn.com/course/matlab-%EC%8B%9C%EC%9E%91-programming/

다음으로 아래 주소의 tutorialspoint 사이트에서도 MATLAB 관련 Tutorial 들이 있더군요.

https://www.tutorialspoint.com/matlab/index.htm

영어 자료이긴 하지만 예제들도 굉장히 잘 정리가 되어 있어서 MATLAB 공부하는데 굉장히 좋은 자료로 보입니다. 공부하시는데 참조하시기 바랍니다.



Simulink 에서 테스트 진행시 Signal Builder 를 사용하여 test case 를 만들곤 하는데

signal builder 의 출력은 double 값으로 나오기 때문에 해당 출력을 입력으로 사용하는 블록과 데이터 타입을 맞춰주는 과정이 필요 합니다. 

이렇게 데이터 타입을 맞춰주기 위해 Simulink 에서는 Data Type Conversion 블록을 사용하는데 

Signal 이 여러 개가 되는 경우 일일이  Data Type Conversion 블록을 붙여주는 것도 고된 잡업이더군요. 

그래서 여러개의 Data Type Conversion 블록을 자동으로 생성하도록 하는 MATLAB 코드를 만들어 봤습니다.

코드는 다음과 같습니다. 

dataTypeConversionMake  함수를 사용하기 위해 입력 argument 로 signal 의 갯수를 넣어 줍니다.

아래 코드는 8 개의 signal 에 대한 Data Type Conversion  블록을 만드는 명령 입니다. 

 dataTypeConversionMake(8)

위 명령어를 실행하면 다음과 같이 Simulink 모델이 만들어 집니다. 


해당 모델을 열어 보면 8 개의  Data Type Conversion 블록 연결이 있는 걸 볼 수가 있습니다.


아래 포스팅에서도 소개한적이 있지만 요즘 Simulink 에서는 MDL 확장자 대신에 SLX 를 주로 사용합니다. 


MDL 파일의 경우 에디터에서 열어서 확인 해 볼 수가 있었는데 SLX 파일의 경우 에디터에서 열어 볼 수가 없더군요. 

그래서 오늘은 SLX 파일을 텍스트 에디터에서 확인 하는 방법에 대해 소개해 보려 합니다.

SLX 파일은 JAR 와 같이 아카이브 파일 형태라고 합니다.

test.slx 파일이 잇다면 파일의 확장자를 test.zip 으로 변경합니다.

다음과 같은 메시지가 나오는데 예를 클릭합니다.


test.zip 파일을 압축 프로그램을 사용하여 압축 해제 합니다. 저는 반디집을 사용했습니다.

압축을 해제 하고 폴더에 들어가 보면 아래 그림과 같이 xml 파일이 나타납니다.


Simulink 폴더에 들어가면 아래 그림과 같은 파일들이 나타나고


blockdiagram.xml 파일에는 Simulink블록도 정보가 나타나고

stateflow.xml 에는 stateflow 의 정보가 포함되어 있습니다.

에디터에서 Simulink정보를 수정한 경우에는 폴더를 압축한후 파일명을 slx 로 만들어 준 후에 Simulink에서 열면 될 것입니다.

막상 파일을 텍스트 에디터에서 열었더니 XML 의 각 태그의 의미가 어떻게 되는건지 정확히 모르겠네요.

텍스트 에디터를 통해 SLX 파일을 수정 할 때는 XML 파일의 구조를 완벽히 파악 한 후에 작업해야 할 것으로 생각되네요.




MATLAB 에서 바로가기를 통해 작업 폴더에 접근하면 작업 폴더에 조금 더 효율적으로 접근 할 수 있습니다.

이에 관련된 내용들에 대해서는 아래 포스팅에서 설명한 적이 있습니다. 


그런데 이러한 셋팅 파일들의 경우 보통 C 드라이브에 저장이 되기 때문에 컴퓨터를 포멧하거나 하면 설정들이 날아가 버려서 다시 설정해야 합니다. 

바로가기가 한 두개라면 쉽게 복구 가능 하겠지만 저 처럼 바로가기를 많이 사용 하시는 분들이라면 바로가기를 백업 해 놓는게 좋을 겁니다.

MATLAB 설정 관련된 파일들은 아래 폴더에서 확인 할 수 있습니다.

MATLAB Command Window 에서 prefdir 라고 타이핑 하면 아래와 같이 설정 파일들이 들어 있는 폴더가 나옵니다.

prefdir

ans =

C:\Users\userNAME\AppData\Roaming\MathWorks\MATLAB\R2016b

위 디렉토리 명에서 userNAME사용자 아이디를 의미 합니다.

  • 바로가기는 shortcuts_2.xml 라는 파일에 저장 됩니다. 

shortcuts_2.xml 파일을 백업했다가 MATLAB 재 설치시 prefdir 에 저장해 주면 됩니다.

백업하는게 귀찮으신 분들은 D:\ 와 같이 포멧하지 않는 폴더에 shortcuts_2.xml 파일을 만들고 prefdir 폴더에 symbolic link 로 만들어도 될 겁니다. 

  • 빠른 액세스 도구 모음의 경우 MATLABQuickAccess.xml 파일에 저장 됩니다. 

마찮가지로 해당 파일을 백업을 해 뒀다가 향후 MATLAB 재 설치시 다시 사용한다면 편리하게 사용 하실 수 있을 겁니다.



MATLAB 을 사용하여 그래프를 그리는 경우 축을 반전해서 보는게 편한 경우가 종종 있습니다.

이런 경우에는 두가지 방법을 사용할 수 있습니다. 



아래 예에 대해 축을 반전하고 싶은 경우


x=1:0.1:10;
y=sin(x);

plot(x,y)
grid on


  • 플롯 툴을 사용하여 변경하는 방법

플롯 툴 아이콘을 클릭하여  플롯 툴을 실행 합니다. 



다음으로 그래프의 Axis 선택한 이후에 반전하고 싶은 축을 선택하고 반전에 체크를 하고 마지막으로 플롯 툴 숨기기를 클릭 합니다.
위 그림과 비교해보면 X 축의 값이 좌우가 바뀐것을 확인 할 수 있습니다.
Y 축 또는 Z 축 값을 반전하고 싶은 경우라면 아래 그림에서 X축 Y축  탭을 선택한 이후에 반전을 체크해 주면 되겠죠~ 

  • 코드 상에서 변경하는 방법

코드에서 반전 설정하는 방법은 아래와 같습니다.

x=1:0.1:10;
y=sin(x);

figure1 = figure; % 그래프 핸들 설정
axes1 = axes('Parent',figure1); % 축 설정
plot(x,y)
grid on
set(axes1,'XDir','reverse'); % axes1 축 반전, 그래프 그리는 코드 뒤에 있어야 함


위 코드에서 주석으로 밝힌 바와 같이 축을 반전 시키는 코드는 그래프 그리는 코드 뒤에 있어야 합니다. Y 축을 반전하고 싶으면 XDir 이라고 된 속성을  YDir 로 변경해 주면 되겠고 Z 축을 반전하고 싶다면 당연히  ZDir 이라고 설정해 주면 됩니다.

X, Y 축을 둘다 반전하고 싶다면 다음과 같이 설정하면 되겠고~ 

set(axes1,'XDir','reverse','YDir','reverse');


다음과 같은 그래프가 나오는 것을 확인 할 수 있습니다.

축 반전은 값이 변하는게 아니라 그래프의 축만 변화 시키는 것이므로 헷갈려서는 안 됩니다.



다음과 같이 간단한 그래프를 하나 그리고 title 을 설정해 보자.

 

x=1:10;

plot(x)

title('X_Y') 

 

위 코드를 실행 시키면 아래와 같은 그래프가 나온다. 그래프에서 확인 할 수 있는 바와 같이 title XY 로 즉 underscore(_) 로 인해 Y 라는 텍스트가 아래 첨자로 된 것을 확인 할 수 있다.

 

 

 

underscore 로 인한 아래첨자 효과를 없애 주려면 underscore 앞에 \ escaping 하면 된다. 다음과 같이 코딩하면

 

title('X\_Y')

 

이런 결과가 나온다. 

 


그런데 이런 식으로 모든 underscore  escaping 을 하는 것도 귀찮은 경우에는 다음과 같이 underscore 와 같은 문자들을 Interpretering 하지 않도록 설정할 수 있다.

 

t=title('X_Y_A_B_C');

set(t,'Interpreter','none');  



MATLAB 에서 특정 폴더의 m 파일을 모든 workspace 에서 사용하기 위해서는 해당 폴더를 path 로 설정해야 합니다.

 

그래야 MATLAB 에서 해당 폴더 내의 파일을 인식 할 수 있죠.

 

보통은 MATLAB 의 pathtool 에서 설정하곤 하는데~

 

Startup 파일을 만들어서 설정할 수도 있습니다. startup.m 파일 관련해서는 아래 주소 글 참조 바랍니다.

 

http://iamaman.tistory.com/995

 

오늘 소개할 내용은 MATLAB 환경변수를 설정해서 MATLAB path 를 설정하는 방법인데 이에 대해서는 아래 매뉴얼에 소개가 되어 있습니다.

 

https://kr.mathworks.com/help/matlab/matlab_env/add-folders-to-matlab-search-path-at-startup.html

 

MATLABPATH 라는 이름의 환경 변수에 세미콜론( ; )을 구분자로 해서 path 를 설정하면 됩니다.

 

윈도우에서는 임시로 환경변수를 설정하고 싶다면 set 을 사용하고 영구적으로 환경변수를 설정하기 위해서는 setx 를 사용합니다.

 

아래 명령어는 setx 를 사용하여 두 개의 폴더를 시스템 환경변수로 설정하는 예입니다.

 

setx MATLABPATH "D:\path1;D:\path2" /m

 

환경 변수를 설정한 후에 MATLAB 을 실행하고 path 라는 명령어를 통해 MATLAB 의 path 를 확인 해보면 위에서 설정한 두 폴더가 추가 된 걸 확인 할 수 있을 겁니다.

 

혹시 설정 후에 MATLAB 을 실행 했는데 환경 변수가 설정되어 있지 않다면 Windows 를 재부팅 해보시기 바랍니다.


MATLAB 은 정말 많은 부분을 자동화 할 수 있는 툴입니다.

 

Simulink 를 사용하신다고 하더라도 MATLAB 을 제대로 다룰 줄 알아야 Simulink 를 효율 적으로 사용 할 수 있습니다.

 

코드 생성과 같이 시간이 좀 많이 걸리는 작업을 실행할 때 컴퓨터 앞에서 계속 앉아 있다면 참 답답 할 겁니다.

 

이럴 때 저는 MATLAB 에서의 작업이 끝나면 메일을 보내도록 설정해 놓고 나가서 커피 한잔 하면서 쉬곤 합니다.

 

요즘 대부분 스마트폰을 사용하니 휴대폰으로 메일을 확인 할 수 있을테고

 

작업이 완료 됐다는 메일을 받으면 들어와서 그 이후의 작업을 하는거죠.

 

저는 Windows 환경이고 메일 프로그램으로 Ms 아웃룩을 사용 합니다.

 

MATLAB 에서는 MS Office 제품군을 자동활 할 수 있습니다.

 

메일을 보내는 간단한 스크립트는 아래와 같습니다. Subject 에 메일 제목을 넣고 To에 보낼 사람, HTMLBody 에 메일 내용을 적습니다.

 

h = actxserver('outlook.Application');

mail = h.CreateItem('olMail');

mail.Subject = 'Mail Test';

mail.To = 'nnn@naver.com';

 

mail.BodyFormat = 'olFormatHTML';

mail.HTMLBody = 'This is Body';

mail.Send;

h.release;

 

MATLAB 에서 시간이 오래 걸리는 작업을 돌려 놓고 마지막에 위 스크립트를 실행 되도록 한다면 MATLAB 이 돌아가는 동안에 나가서 커피 한잔 하고

 

다 되면 휴대폰으로 확인하고 ~

 

들어와서 다음 작업을 하는 식이죠~



  1. 2016.11.02 22:27

    비밀댓글입니다

MATLAB 을 사용하여 압축을 하고 싶으면 zip() 이라는 함수를 사용 합니다.

 

현재 폴더의 하위 내용들을 압축하고 싶은 경우 보통은 현재 폴더를 압축하곤 하는데 이렇게 하려면 현재 폴더가 아닌곳에 zip 파일을 저장해야 합니다.

 

오늘은 현재 폴더 하위의 내용들을 압축하는 방법에 대해 소개하려 합니다.

 

현재 폴더의 내용을 검색하는 방법은 dir() 이라는 함수를 사용합니다. dir() 함수는 recursive 한 파일 검색은 되지 않습니다.

 

recursive 한 파일 검색을 하고 싶다면 아래 포스팅을 참조하시면 됩니다.

 

http://iamaman.tistory.com/757

 

아무튼 오늘은 그냥 현재 폴더에 대해서만 검색 할것이므로 dir() 함수를 사용합니다.

 

그런데 dir() 함수를 사용하여 현재 폴더를 검색하면 '.', '..' 라는 폴더가 검색 됩니다.

 

바로 현재와 상위 폴더 입니다.

 

현재 폴더의 하위 내용들을 압축하고 싶기 때문에 그래서 이 부분들을 제외하고 압축을 해야 합니다.

 

위 소개한 부분들을 제외하고 압축을 하는 방법은 아래 코드와 같습니다.

 

a= dir('.');

fileAll=cell(length(a),1);

 

for n=1:length(a)

    if ~(strcmp(a(n).name,'.') || strcmp(a(n).name,'..'))

        fileAll{n}=a(n).name;

    end

end

 

AllFile=fileAll(~cellfun('isempty',fileAll));

zip('CurrentFolder.zip',AllFile);

 


+ Recent posts