2017-04-04 119 views
0

我開發了一個函數來減小初始矢量的大小X = [x,y]。但是對於500000點的Xpoints_limit = 10000,Matlab需要16秒才能完成此功能。Matlab:優化縮小矢量大小

有什麼方法可以優化這個,也許通過使用矩陣運算(vectorisation)去除循環?

function X = reduce_vector_size(X,points_limit) 

while length(X) > points_limit 
    k = 1; 
    X2 = zeros(round(length(X(:,1))/2),2); 
    X = sortrows(X); 
    for i=1:2:length(X(:,1))-1 
     X2(k,1) = mean([X(i,1) ,X(i+1,1) ]); 
     X2(k,2) = mean([X(i,2) ,X(i+1,2) ]); 
     k = k + 1; 
    end 
    X = X2; 
end 

的其它最好的辦法是有一種新的方法:

Ratio = ceil(length(X(:,1))/points_limit); 
X = ceil(X); 
X = sortrows(X,1); 
X = sortrows(X,2); 
X1=[]; 
for i=1:points_limit - 1 
    X1 = [X1; mean(X(i*Ratio:(i+1)*Ratio,1)), mean(X(i*Ratio:(i+1)*Ratio,2))]; 
end 
X = X1; 

的目的是減少在載體中的點的數量:用於2D向量壓縮函數的形式。

你知道我是否可以用循環做這個新方法?

你對我的壓縮算法有什麼看法?

+0

如果你描述你想要做什麼這將有助於。 – beaker

+0

我想減少太長的vertor。例如,如果X = 500000的長度,我想在不改變矢量的情況下可以減少30 000點的長度。 – gpbdr13

+0

對不起,這並不能告訴我任何事情。如果你只是想將矢量的長度減少到30,000點,你可以使用'X = X(1:30000)'。當然還有其他事情在這裏發生。 – beaker

回答

1

您可以輕鬆地向量化內的for循環:

k = 1; 
X = rand(5e5,2); 
X2 = zeros(round(length(X(:,1))/2),2); 
tic 
for i=1:2:length(X(:,1))-1 
    X2(k,1) = mean([X(i,1) ,X(i+1,1) ]); 
    X2(k,2) = mean([X(i,2) ,X(i+1,2) ]); 
    k = k + 1; 
end 
toc % Elapsed time is 1.988739 seconds. 
tic 
X3 = (X(1:2:length(X(:,1))-1,:) + X(2:2:length(X(:,1)),:))/2; 
toc % Elapsed time is 0.014575 seconds. 
isequal(X2,X3) % true 
+0

也許我們也可以優化太多的循環,以達到超過2點直接得到好點數? – gpbdr13