Matlab:优化缩小矢量大小

Matlab:优化缩小矢量大小

问题描述:

我开发了一个函数来减小初始矢量的大小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

您可以轻松地向量化内的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