이번역페이지는최신내용을담고있지않습니다。최신내용을문으로보려면여기를클릭하십시오。
벡터화
벡터화사용
MATLAB®은행렬및벡터연산에최적화되어있습니다。MATLAB행렬과벡터연산을사용하도록루프기반의,스칼라위주의코드를수정하는과정을벡터화라고합니다。다음과같은이유에서코드를벡터화할가치가있습니다。
모양:벡터화된수학코드는교재에서볼수있는수학표현식과비슷한모양으로,이해하기가더쉽습니다。
오류발생가능성감소:루프가없는,벡터화된코드는길이가짧은경우가많습니다。코드의라수가적으면프로그래밍오류가발생할가능성이줄어듭니다。
성능:벡터화된코드는같은작업을수행하는루프가포함된코드보다훨씬더빠르게실행됩니다。
일반계산에대해코드벡터화하기
다음코드는0부터10까지의범위에속하는1001개값의사값을계산합니다。
I = 0;当t = 0时。01:10 I = I + 1;Y (i) = sint;结束
다음은동일한코드가벡터화된형태입니다。
T = 0:.01:10;Y = sint;
두번째코드예제는일반적으로첫번째코드예제보다더빠르게실행되며,MATLAB을보다효율적으로사용하는방법입니다。위의코드가포함된스크립트를만들어시스템에서실행속도를테스트하고,抽搐
과toc
함수를사용하여실행시간을측정해보십시오。
특정작업에대해코드벡터화하기
다음코드는매5번째소에서벡터의누적합을계산합니다。
X = 1:10000;Ylength = (length(x) - mod(length(x),5))/5;Y (1:ylength) = 0;对于n= 5:5:长度(x) y(n/5) = sum(x(1:n));结束
벡터화를하면훨씬더간결한matlab프로세스를작성할수있습니다。다음코드는그것의한예를보여줍니다。
X = 1:10000;xsum = cumsum(x);Y = xsum(5:5:长度(x));
배열 연산
배열연산자는데이터세트의모든소에대해동일한연산을수행합니다。이러한연산유형은반복적계산에유용합니다。예를들어、원뿔의지름(D
)과높이(H
)를기록하여다양한원뿔의부피(V
)를수집한다고가정하겠습니다。원뿔하나에대한정보만수집하는경우이단일원뿔의부피는다음과같이계산할수있습니다。
V = 1/12*pi*(D^2)*H;
이제,10000개의원뿔에대한정보를수집해보십시오。벡터D
와H
에는각각10000개의요소가포함되어있으며,지금은10000개의부피값을계산해야되는상황입니다。대부분의프로그래밍언어에서는다음matlab코드와비슷한루프를설정해야합니다。
为V(n) = 1/12*pi*(D(n)²)*H(n);结束
MATLAB에서는스칼라의경우와유사한구문을사용하여벡터의각요소에대해계산을수행할수있습니다。
%矢量化计算V = 1/12*pi*(d ^2).*H;
참고
연산자*
,/
,^
앞에마침通讯录(.
)를추가하면이러한연산자가배열연산자로변환됩니다。
배열연산자를사용하면차원이서로다른행렬을결합할수도있습니다。1인이렇게크기가차원을자동으로확장하는기능은그리드생성,행렬과벡터연산등을벡터화하는데유용합니다。
행렬一个
가테스트점수를나타내고,각행이서로다른학급을나타낸다고가정하겠습니다。각학급의평균점수와학생개별점수간의차이를계산하려고한다고생각해봅시다。루프를사용할경우연산은다음과같습니다。
A = [97 89 84;95 82 92;64 80 99;76 77 67;...88 59 74;78 66 87;55 93 85];mA = mean(A);B = 0(大小(A));为n = 1:size(A,2) B(:,n) = A(:,n) - mA(n);结束
이를보다직접적으로계산하는방법은루프를실행할필가없고속도가훨씬빠른A -均值(A)
를사용하는것입니다。
devA = A - mean(A)
devA = 18 11 0 16 4 8 -15 2 15 -3 -1 -17 9 -19 -10 -1 -12 3 -24 15
一个
가7×3행렬이고意思是(A)
1×3벡터인경우에도MATLAB은행렬과크기가같은것처럼벡터를암시적으로확장하며,연산은정상적인요소별뺄셈연산으로실행됩니다。
피연산자의크기요구사항은각차원의크기요구사항으로,배열의크기가모두동일하거나배열중하나의크기가1이어야합니다。이요구사항이충족되면배열중하나의크기인가1차원은다른배열의상응하는차원과같은크기로확장됩니다。자세한내용은기본연산에대해호환되는배열크기항목을참조하십시오。
벡터화에암시적확장이유용하게쓰이는또다른경우는다차원데이터를사용할때입니다。두 변수x
와y
의 함수F
를실행한다고가정하겠습니다。
F(x,y) = x*exp(-x2- y2)
x
벡터와y
벡터의점의모든조합에대해이함수를실행하려면다음과같이값의그리드를정의해야합니다。이작업에서는루프를사용하여점조합을반복해서는됩니다。대신벡터중하나가열이고다른하나는행marketing경우,벡터가x + y
또는x - y
같은배열연산자와함께사용되면matlab은자동으로그리드를생성합니다。이예제에서x
는21×1벡터이고y
는1×16벡터이기때문에이작업은x
의두번째차원과y
의첫번째차원을확장하여21×16행렬을생성합니다。
X = (-2:0.2:2)';% 21-by-1Y = -1.5:0.2:1.5;% 1-by-16F = x.*exp(-x.²-y.²);% 21-by-16
논리형배열연산
배열의대량처리를논리적으로확장한다는것은비교와의사결정작업을벡터화하는것입니다。Matlab비교연산자는벡터입력값을받고벡터출력값을반환합니다。
예를들어10000개의원뿔에서데이터를수집하는동안지름에여러개의음수값을기록한다고가정하겠습니다。> =
연산자를사용하여벡터에서유효한값이무엇지파악할수있습니다。
D = [-0.2 1.0 1.5 3.0 -1.0 4.2 3.14];D >= 0
Ans = 0 1 1 1 0 1 1
D
의소에대응하는유효한원뿔부피값Vgood
을선별할수있습니다。Vgood = V(D >= 0);
Matlab에서는함수所有
과任何
를각각사용하여전체벡터의요소에대해논리적,또는연或산을수행할수있습니다。다음과같이,D
의모든값이0보다작은경우경고를발생시킬수있습니다。
如果所有(D < 0)警告(“所有直径值都是负数。”)返回结束
MATLAB은호환되는크기의두벡터를비교할수있으므로이를통해추가적인제한을둘수있습니다。다음코드는v가음수가아니며D
가H
보다큰모든값을찾습니다。
V((V >= 0) & (d > h))
비교에도움을줄수있도록,MATLAB에는오버플로,언더플로,정의되지않은연산자를나타내는특수값(예:正
,南
)이있습니다。논리연산자isinf
와isnan
은이러한특수값에대해논리테스트를수행하는데도움이됩니다。예를들어,다음과같이계산에서南
값을제외시키는것이유용할때가종종있습니다。
x = [2 -1 0 3 NaN 2 NaN 11 4 Inf];Xvalid = x(~isnan(x))
xvalid = 2 -1 0 3 2 11 4 Inf
참고
Inf == Inf
는真实를반환하지만,NaN == NaN
은항상假를반환합니다。
행렬 연산
코드를벡터화할때는특정크기또는구조를갖는행렬을생성해야하는경우가종종있습니다。이를위해획일한행렬을만들수있는기법이있습니다。예를들어,동일한소로구성된5×5행렬이필할수있습니다。
A = ones(5,5)*10;
V = 1:5;A = repmat(v,3,1)
A = 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
함수repmat
는작은행렬이나벡터를더큰행렬로키울수있는유연성을제공합니다。repmat
는다음과같이입력행렬을반복하여행렬을만듭니다。
A = repmat(1:3,5,2) B = repmat([1 2;3, 2, 2)
A = 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 4 1 2 1 2 3 4 3 4
정렬,설정,셈작업
여러응용프로그램에서,벡터의요소에대해수행되는계산은동일한벡터에있는다른요소에따라달라집니다。예를들어,벡터x는집합을나타낼수있습니다。为
또는而
루프를사용하지않고어떻게집합요소에대한반복연산을할수있는지는명백하지않습니다。벡터화된코드를사용하면프로세스가훨씬더명확해지고구문도덜복잡해집니다。
중복소제거하기
벡터내의중복소를찾는방법에는여러가지가있습니다。그중하나는함수diff
를이용하는것입니다。벡터소를정렬한후에,이벡터에diff
함수를사용하면동일한소가접한경우0이생성됩니다。diff (x)
는x
보다요소가한개더적은벡터를생성하기때문에,이집합내의요소와동일하지않은요소를하나추가해야합니다。南
은항상이조건을충족합니다。마지막으로,다음과같이논리형인덱싱을사용하여집합내의고유한요소를선택할수있습니다。
X = [2 1 2 2 3 1 3 2 1 3];X = sort(X);差异= diff([x,NaN]);Y = x(差~=0)
Y = 1 2 3
独特的
함수를사용해도동일한작업을수행할수있습니다。y =独特(x);
独特的
함수는필이상의기능을제공하여코드실행속도를둔화시킬수있습니다。각코드조각(代码片段)의성능을측정하려면抽搐
과toc
함수를사용하십시오。
벡터의소개수세기
단순히x
의집합이나부분집합을반환하는대신,벡터의소개수를셀수있습니다。벡터가정렬된후에找到
함수를사용하여diff (x)
에서값이0。找到
함수의이후덱스간의차이는특정소의개수를나타냅니다。
X = [2 1 2 2 3 1 3 2 1 3];X = sort(X);差异= diff([x,max(x)+1]);Count = diff(find([1,difference])) y = x(find(difference))
计数= 3 4 3 y = 1 2 3
找到
함수는南
소에대한덱스는반환하지않습니다。isnan
함수와isinf
함수를사용하여南
값과正
값의개수를셀수있습니다。
Count_nans = sum(isnan(x(:)));Count_infs = sum(isinf(x(:)));
벡터화에흔히사용되는함수
함수 | 설명 |
---|---|
所有 |
모든배열소가0이아닌값지아니면true지확 |
任何 |
모든배열소가0이아닌값지확 |
cumsum |
누적합(累计总和) |
diff |
차분과근사도함수 |
找到 |
0이아닌소의값이나덱스찾기 |
ind2sub |
선형덱스의첨자 |
ipermute |
N차원배열의차원역치환(逆排列) |
逻辑 |
숫자형값을논리값(逻辑)으로변환 |
meshgrid |
2차원공간과3차원공간의사각그리드(矩形网格) |
ndgrid |
N차원공간의사각그리드 |
交换 |
N차원배열의차원재배열 |
刺激 |
배열소의곱 |
repmat |
배열의복사본을반복함 |
重塑 |
배열형태변경(重塑) |
shiftdim |
차원 전환 |
排序 |
배열소정렬 |
挤压 |
한원소(单例)차원제거 |
sub2ind |
첨자를선형덱스로변환 |
总和 |
배열소의합 |