Matlab:优化缩小矢量大小
问题描述:
我开发了一个函数来减小初始矢量的大小X = [x,y]
。但是对于500000点的X
和points_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向量压缩函数的形式。
你知道我是否可以用循环做这个新方法?
你对我的压缩算法有什么看法?
答
您可以轻松地向量化内的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
如果你描述你想要做什么这将有助于。 – beaker
我想减少太长的vertor。例如,如果X = 500000的长度,我想在不改变矢量的情况下可以减少30 000点的长度。 – gpbdr13
对不起,这并不能告诉我任何事情。如果你只是想将矢量的长度减少到30,000点,你可以使用'X = X(1:30000)'。当然还有其他事情在这里发生。 – beaker