참고 사이트 : http://huniv.hongik.ac.kr/~shittc/matlab.htm
공부 사이트 : http://web.cecs.pdx.edu/~gerry/MATLAB/variables/vectors.html
API 레퍼런스 : http://kr.mathworks.com/help/matlab/ref/size.html
(기본적으로 문법과 API는 구글링을 잘해야함..)



MATLAB 고급 테크닉(for문 없이 빠른 연산)

길이가 다른 두개의 vector의 대소 비교 : meshgrid를 이용, 메모리를 많이 사용하여 n*m개의 비교를 빠르게 수행한다.

    [short, long] = meshgrid(acts_time, action);
    [~, ii] = max(short<long,[],1)

(대소비교가 아닌 경우는 간단히 ismember함수로 처리 가능하다.)


One of K coding : logic matrix를 만들고, target 벡터를 확장시켜서 == 비교함. 위의 방법과 유사한 아이디어.

    logic_matrix=repmat([1:layer(end)],minibatch_size,1);
    rep_target_array=repmat(tmp_target,1,layer(end));
    target = logic_matrix==rep_target_array;


HLOOKUP like function : ismember함수를 이용하여 엑셀의 HLOOKUP같은 기능 구현

    acts_result=acts_labels(find(ii~=1),2);
    [found1,acts_index]=ismember(acts_result,acts_class(:,1));


Cell matrix의 element-wise sum : cell들을 cell2mat으로 변환한다음 3차원으로 reshape해서 이상하게 더하는 것 보다, 아래 방식으로 concat을 3차원으로 쌓아서 더해버리는 2배 더 빠름.

for ~~
    sum(cat(3, gradient{layer_index,:}),3);
end


2차원 matrix를 [x,y] 크기로 짤라서 3차원으로 쌓기 : 그냥 for문 + cat쓰는게 제일 쉽고빠름

ratio = 10;
for i = 1:size(nn_out,1)/ratio
    nn_out3d(:,:,i) = cat(3, nn_out(1+((i-1)*ratio):(i*ratio),:));
end


Binomial 분포를 이용한 sampling : 지정한 확률 p로 해당 데이터를 샘플링한다.
%1번시행해서 , p확률로 나온 {0,1}의 결과를 , 몇개의 matrix만큼 계산할지

binary=logical(binornd(1,prob, size(nn_out(:,end))));
balanced_sample{i} = nn_out(binary,:);


MATLAB 문법

변수선언 : 파이썬이나 JS같은 스크립트언어 처럼, 변수 타입선언 없이 바로 사용함.
행렬 인덱스 규칙 : (a,b) 이면 a는 세로축, row이고 b는 가로축, column이다. (ㄴ 방향) 또한 C언어와 달리 인덱스 숫자가 1부터 시작함

행렬 조작에서 자주 쓰이는 것들
1) transpose ' , permute
2) reshape 2,3차원
3) find
4) repmat
5) [1:2,5]

Matrix : 간단히 2차원 배열이라고 생각하면 편하다. 다만 매틀랩에서 지원하는 matrix연산을 사용하면 for문을 사용하는 것보다 훨씬 더 빠르게 행렬 연산을 할 수 있다.
인덱스는 접근 : (a,b)를 사용하여 value를 가져올 수 있다

Cell : 2차원 포인터 배열이다. 따라서 int나 double이 아닌 문자열 등 모든 타입을 저장할 수 있다.(Cell안에 Cell도 넣을 수는 있음)
인덱스는 접근 : (a,b)를 사용하면 cell의 포인터를 가져오고,
{a,b}를 사용하면 포인터가 가리키는 데이터를 가져온다. ex) list{1,1} -> (1,1) 위치의 문자열을 가져옴


Cell{1} 을 하면, 첫번째 줄이 전부 선택되고, Cell(1,1)하면 첫 번째 줄에서 1번 인덱스가 선택됨. (기본이 2차원 배열)



[A, B, C] : 매트릭스를 가로로 붙이기 (Cell도 똑같이 적용됨)
ex) X = [X, Y];  // Y행렬을 X행렬 오른쪽에 누적함

[A; B; C] : 매트릭스를 세로로 붙이기 (Cell도 똑같이 적용됨)
ex) X = [X ; Y] // Y행렬을 X행렬 아래쪽에 누적함

-> 그런데 이런식으로 할 때 주의할 점은 X에 새로운 메모리를 할당하는 new 과정이 매우 느리다는 것이다. 따라서 사이즈가 커지면 이렇게 하면 안된다.

매틀랩은 어떤 식으로든 for문을 도는 순간 느려진다고 보아야한다. for문이 100개이상만 처리해도 매우 느리다고 생각 할 것. 그래서 가능한 행렬이나 배열을 통째로, 전체를 한 번에 처리해야 빠르다. 

ex) 위 아래 코드는 동일하게 6*13짜리 행렬을 한줄로 이어 붙이는 코드이다.
그러나 위의 코드는 아무리 메모리를 미리 할당해놓더라도 for문이 엄청난 길이의 연산을 해서 속도가 느리다.(1분이상 소요) 반면 아래 코드는 for문을 전혀 쓰지 않고, 한 매트릭스를 통째로 한 번에 처리하기 때문에 1초이내에 연산이 끝난다.

    for k = 1:numel(mfcc_bjlee_new.d20150303)
        labeled_data = [ labeled_data; mfcc_bjlee_new.d20150303{1,k}.val];
    end

% struct array로 변환한뒤 이를 3차원배열로 reshape하고 3차원에서 transpose하여 2차원으로 다시 만들었다
    struct_arr = [mfcc_bjlee_new.d20150303{:}]; %struct를 array로 변환함
    values = [struct_arr.val];                    % struct의 array에서 val값만 가져옴
    rs_values = reshape(values,6,13,[]);
    data = reshape(permute(rs_values, [1,3,2]), [], 13); % permute는 3차원 transpose하는 함수임


스트럭르를 배열(행렬)로 바꾸기 : struct_array=[struct];


A(1, :) : 행은 1번을, 컬럼은 모든 컬럼을 선택한 부분 행렬을 리턴함.
( , 를 기준으로 왼쪽은 row, 오른쪽은 column을 의미함. a:b 는 a~b까지의 범위를 의미하고, 1:end 는 전체를 의미함. 이 때 1과 end는 생략이 가능함. 단, 1만 적는 경우는 허용되지 않음)


[1:4,9] : 1~4와 9 를 선택

셀, 행렬의 성분 삭제 : X(1,1) = [];
셀, 행렬의 Row 삭제X(1,:) = [];

행렬 transpose : '


cellplot(a) : 셀 배열의 구조를 그래픽으로 표시


화면 출력 :  " ; " 없이 변수 명만 적거나 실행하면 커맨드창에 출력이 됨. (또는 disp() 함수 사용)


not 을 뜻 하는 기호 : ~ (!이 아님)
같지않음 기호 : !=가 아니라, ~= 임
같음 기호 : ==



% : 주석
%% : 코드의 section을 나눔(section별로 코드 실행이 가능)
n:m : n~m 까지의 자연수가 담긴 vector를 반환함
0:0.2:2 : 0부터 2까지 값이 0.2 간격으로 증가하는 vector를 리턴함

제곱 계산 : 3^2 = 3.^2 = 3.0^2



.mat 확장자 : 매트릭스 data들을 저장하는 파일 포멧
(보통 파일을 읽어서 mat형태로 저장시킴)

... : 기능은 없는 단순 표현 문법으로, 한줄을 다음 줄로 옮길 때 사용함(영어에서 - 같은 느낌)


for 문

for [vector]
end

for index=1:10  % 1:10을 하면 1~10까지 1씩 증가하는 vector가 나옴
end

for index=10:-1:1  % 응용해서 이런식으로 10부터 1씩감소하는 식으로 사용할 수 있음
end


함수 정의 : 함수를 정의하려면 반드시 함수이름.m 파일에 정의해야함.

function y=함수명(파라미터)
    y=~~~
end
(함수의 아웃풋을 매트릭스로 지정하여, 동시에 2개이상의 변수리턴이 가능)

function y = sig(x)
    y = 1./(1+exp(-(x)));
end


Anonymous Function : C언어의 매크로 함수 생각하면 될 듯.

sig = @(x,w,b) 1./(1+exp(-(w*x+b)));
-> sig(x,w,b) 하면 계산이 바로 됨.

중요한 점은 이렇게 생성한 

http://kr.mathworks.com/help/matlab/matlab_prog/anonymous-functions.html


Cell fun : cellfun(@함수이름, 크기가 같은 cell들)

이렇게 하면 @으로 지정된 임의의 특정 function handle를 각각의 cell들에 대해서 실행시킨 결과가 리턴된다.

이때 @sum 과 같이 이미 지정된 함수를 사용하는 것도 가능하지만, 내가 직접 anonymous function으로 생성한 함수를 넣는 것도 가능하다.

http://kr.mathworks.com/help/matlab/ref/cellfun.html#inputarg_func
http://kr.mathworks.com/help/matlab/ref/function_handle.html
http://kr.mathworks.com/help/matlab/matlab_prog/creating-a-function-handle.html


그러나 cell fun이 for 문을 사용한 것보다 속도가 항상 빠르진 않다. 느릴 때도 있다. 따라서 cell fun의 목적은 속도보다는 가독성과 빠르고 편한 구현이라고 보는게 맞을듯. 속도는 그냥 행렬만 가지고 조작하는게 최고속도일듯?

http://stackoverflow.com/questions/16143314/matlab-arrayfun-cellfun-spfun-and-structfun-vs-simple-for-loop


MATLAB API

size(matrix, 축) : matrix의 크기, 길이를 알려 줌(length의 상위 호환)

d = size(X)

[m,n] = size(X)
m = size(X,dim)
[d1,d2,d3,...,dn] = size(X),

row=size(A,1) : 변수 row에 행의 개수를 출력
col=size(A,2) : 변수 col에 열의 개수를 출력

length(vector) : vector의 크기, 길이를 알려 줌

load(파일경로) : 파일을 읽어 workspace에 등록, 즉 메모리에 로딩하는 함수
save('저장할 mat 파일이름', '저장할 변수 1','저장할 변수 2'); : mat 파일로 메모리를 저장하기


clc : command 창 지우기
clear : 작업공간 메모리 다지우기
clear A : A지우기


zeros(n,m) : (n,1)짜리 0으로 가득한 행렬을 만든다.(또는 벡터)
ones(n,m)
 (n,m)짜리 1로 가득한 행렬을 만든다.(또는 벡터)
(이와 유사한 api로 linspace, logspace가 존재한다.)

1:3:50 : 1부터 50까지, 3씩 증가하는 벡터를 생서한다.


cat(3, cell)matrix_array{row, :}) : 이렇게하면 셀들이 3차원 배열 형태로 쌓여짐.

whos(a) : a 메모리에 대한 사이즈나 바이트 같은걸 알려줌

수행 시간 측정 : tic; toc;

datenum: 시간으로된 string을 인티저로바꿔주는듯? 초단위?

random seed 고정하기 : rng(123);
스파스 랜덤 매트릭스 생성 : weight(i)=sprand(layer(i),layer(i+1),1)};
풀 랜덤 매트릭스 생성 : weight(i)={((0.4)*rand(layer(i),layer(i+1),1))-0.2};


abs(x) : x의 절대값을 반환함
sign(x) : x의 부호에 따라 -1, 0, 1을 반환함.
% 특히 경계 체크할 때 abs와 더불어 이 함수를 이용해 처리하면 용이함.


matrix의 element 끼리 곱셈하기(element wise multiplication) : A.*b 또는 times(A,B)
http://kr.mathworks.com/help/matlab/ref/times.html

matrix의 element 끼리 나눗셈하기(element wise division) : A ./ B


반올림 : round
내림 : floor
올림 : ceil

find(X==1) : X행렬에서 값이 조건식을 만족하는 인덱스들을 반환함. 이때 인덱스는 row방향으로 증가 1씩 증가하는 인덱스임.즉 column을 row쪽으로 쭉 1자로 봤을 때의 인덱스를 반환함.
ex) find(data==2)
find(data==1 | data==2); % matlab 에서는 ||이 아니라 | 한 번임, & 도 마찬가지.

find는 해당조건을 만족하는 1번 인덱스만가져옴.


mat2cell(A(1,:)== {A(1,:)} : matrix A 를 cell로 변환함
cell2mat(A(1,:)) == [A{1,:}] : cell A 를 matrix로 변환함.

ex)    [sum_gradient{layer_index,:}] == cell2mat(sum_gradient(layer_index,:))
        % []이걸 쓰면 {}로 접근한걸 cell2mat하는 효과인듯.


min, max : matrix에서 최대, 최소 인덱스를 접근

numel : number of element

diff : vector에서 두 각 엘리먼트간의 차이를 리턴해준다.
ex) diff([1,2,3,4,5]) = [1,1,1,1] (첫항은 0이 되는 듯)

레퍼런스 검색 : doc mat2cell / help mat2cell / 함수에 대고 F1 키

white_noise = wgn(100,1,0) : gaussian noise를 생성함.


행렬에서 인덱스 조건검사하면서 바로 대입하기

input(input > 1) = 1


정렬하기 : sort(A,1); % 특히 두번 째 리턴 값을 이용하면, 다른 행렬이나 cell도 같은 순서로 오더링을 시킬 수 있음.

[acts_time_label,INDEX] = sort(acts_time_label,1);
acts_labels = acts_labels(INDEX,:);

pause : 스크립트 일시정지

x = randperm(150)  % n: 행렬의 인덱스를 랜덤으로 만든다

idx_test = x(1:100)

idx_train = x(101:150)

unique(행렬) : 겹치지 않는 고유한 element만 보여준다
reshape : 행렬의 크기를 변환, 데이터 처리할 때 매우 자주 사용되며 2차원 -> 3차원으로도 변환이 가능하다. 중요한 점은 꽤나 속도가 빠른 편이라는 것이다.
repmat : vector를 아래쪽방향으로 복사

str2num : string을 숫자로
str2double : string을 double로


strcat('문자열_','문자열2');


-matrix를 csv 파일로 출력하기
csv_header = cell(1, size(data,2));
fid = fopen('data_lifeom.csv', 'wt');
fprintf(fid, 'labels\n');                        %원하는 내용 출력
dlmwrite('data_lifeom.csv', data, '-append'); % 매트릭스 출력
fclose(fid);



http://kr.mathworks.com/help/matlab/math/creating-and-concatenating-matrices.html




[h, pvalue(1,1)] = ttest2(vtr.X, vte.X, 'Vartype','unequal');

for i=pvalue1, index=1:784 % i=행렬 하면, 알아서 각 행렬의 성분이 i에 대입됨. index는 이처럼 따로 줄 수 있음.

    if(i~='NaN')

        p2(index)=i;

elseif

    end

end




figure; plot() 하면 바로 한방에 그려짐


help sort 치면 레퍼런스가 열림


사람의 뇌는 개인차가 매우 커, 개인 별로 클래시피케이션 해야됨. 합쳐서 제너럴하게 클래시피케이션하면 안됨


3차원 배열은 걍( : , : , : ) 하면 됨.

타임시리즈 데이터는 각 x와 y 그래프에서 점들을 나타내는 데이터라고 보면됨.

따라서 x와 y 축의 크기만큼의 행렬이 있음.


mutual information 은 infomation gain 하고 비슷한 건데,

여러개의 input feature 중에서 output label하고 상관성이 큰 순서대로 점수를 매겨줌.



오른손을 드세요 하면 왼쪽에서 생각한다 같은 걸 실험하는 공개된 EEG 데이터가 있음.

그래서 이 EEG를 보고 이게 왼쪽뇌일까 오른쪽 뇌일까를 맞추는 문제를 품.


 figure1 = figure(1);

 set(gcf,'PaperPositionMode','manual');

 set(hFig, 'Position', [0 0 800 600]);

 axes1 = axes('Parent',figure1);

 xlim(axes1,[-60 10]);

 ylim(axes1,[-20 25]);

 hold(axes1,'all');

 scatter(Xte(:,1), Xte(:,2),4);

num2cell

cell과 array를 합치려면, 둘을 같은 형식으로 바꾸어 준 다음 합쳐야한다.(combine cell, combine array 등)


- 그래프그리기

plot : 이은 선

scatter : 점만 뿌림

ex) scatter(word2vector_vec(:,1),word2vector_vec(:,2),linspace(1,100,length(word2vector_vec(:,1))))
이렇게하면 X의 인덱스마다 1~100을 interpolation한 크기로 점들을 그림. 즉 1번인덱스의 크기는 1, 마지막 인덱스의 크기는 100

imagesc : 뭔지모르지만 다름.


- 파일 이름 바꾸기

files = dir('D:\Dropbox\Programming\MATLAB\swlee_AAAI\swlee_csv\*.csv');
% Loop through each
for id = 1:length(files)
    % parsing the files to get the file name
    [~, file_name] = fileparts(files(id).name);
      files(id).name
      if strcmp(file_name(1:4) , 'Vid_')
          movefile(strcat('D:\Dropbox\Programming\MATLAB\swlee_AAAI\swlee_csv\',files(id).name), strcat('D:\Dropbox\Programming\MATLAB\swlee_AAAI\swlee_csv\',file_name(5:end),'.csv'));
      end
end

http://www.mathworks.com/matlabcentral/answers/1760-how-to-rename-a-bunch-of-files-in-a-folder



MATLAB 단축키 및 사용법

함수 정의 보기 : 컨트롤 + D, 함수에 우측 클릭해서도 가능

스크립트 전체 실행 : F5

스크립트 구간별 실행 : 드래그해서 F9
(원하는 부분들만 드래그하여 F9로 실행)

컨트롤 엔터 : 해당 섹션만 실행
(섹션은 %%로 구분함)


Breakpoint : F12, 왼쪽 라인에 클릭해서도 가능. 그다음 F5로 실행하여 바로 변수값 바로 볼수있고(마우스 커서를 올림), 역시 F10,F11 등으로 스텝 실행 가능


주석 한번에 달기 : Control + R
주석 한번에 지우기 : Control + T

자동완성 : TAB 키


MATLAB 환경설정

- MATLAB 영어 <-> 한글 전환

환경변수-시스템 변수 에서 

MWLOCALE_TRANSLATED 이름을 가진 항목을 추가한다.

값으로 OFF를 넣으면 영어로 나오고

ON 을 넣으면 한글로 나온다.


- 상대 경로 지정 및 경로 추가

매틀랩에서 경로 관련되어 문제가 생기면, 최상위 폴더를 우측 클릭해서 하위폴더까지 전부다 경로에 추가해주어야한다. 그래야 파일을 찾아서 사용할 수 있다. 특히 전부 경로추가를 해주면 데이터도 그냥 파일이름만 적어서 사용이 가능하다.

그래서 딱히 상대경로 '..\' 기능이 필요가 없다.


- 같은 이름의 함수를 사용해서 발생하는 충돌 문제

매틀랩은 네임 스페이스가 없다.

따라서 addpath와 rmpath를 이용해서 그때 그때 지정해서 써야한다.


- 매틀랩 시작시 기본 폴더 변경

매틀랩 바로가기 아이콘의 속성에서 지정한다.

http://ddiri01.tistory.com/85

'프로그래밍 > 프로그래밍 팁' 카테고리의 다른 글

Visual Studio  (0) 2014.11.24
Ubuntu - Screen , zip, tar 사용법  (0) 2014.07.07
MATLAB 문법, API, 단축키, 환경설정  (0) 2014.06.23
Java, 클래스간 변수 공유  (0) 2014.06.19
정규표현식, 정규식  (0) 2014.06.17
Excel, VBA  (0) 2014.06.17
by 곽동현 이스텔리앙 2014.06.23 23:11