Performance 在Matlab中更快地处理大数据?

Performance 在Matlab中更快地处理大数据?,performance,matlab,file-io,vectorization,plaintext,Performance,Matlab,File Io,Vectorization,Plaintext,我必须使用Matlab处理非常大的数据(点云通常超过300000点)。我可以使用textscan功能读取ascii数据。读取后,我需要检测无效数据(坐标为0,0,0的点),然后我需要对数据中的每个点或每条线进行一些数学运算。按照我的方式,首先我用textscan读取数据,然后我将这些数据分配给一个矩阵。其次,我使用for循环来检测无效点,并对数据中的每个点或线进行一些数学运算。我的代码示例如下所示。根据Matlab的profile tooltextscan占37%和行 transformed_l

我必须使用Matlab处理非常大的数据(点云通常超过300000点)。我可以使用
textscan
功能读取ascii数据。读取后,我需要检测无效数据(坐标为
0,0,0
的点),然后我需要对数据中的每个点或每条线进行一些数学运算。按照我的方式,首先我用
textscan
读取数据,然后我将这些数据分配给一个矩阵。其次,我使用
for
循环来检测无效点,并对数据中的每个点或线进行一些数学运算。我的代码示例如下所示。根据Matlab的profile tool
textscan
占37%和行

transformed_list((i:i),(1:4)) = coordinate_list((i:i),(1:4))*t_matrix; 
占所有计算时间的35%

我用另一个点云(存储大约550000个点云)进行了尝试,profile tool报告了相同的结果。对于循环,有没有一种方法可以避免
,或者有没有另一种方法可以加速此计算

fileID = fopen('C:\Users\Mustafa\Desktop\ptx_all_data\dede5.ptx');             
original_data = textscan(fileID,'%f %f %f %f %f %f %f', 'delimiter',' ');
fclose(fileID);
column = original_data{1}(1);
row = original_data{1}(2);
t_matrix = [original_data{1}(7) original_data{2}(7) original_data{3}(7) original_data{4}(7)
    original_data{1}(8) original_data{2}(8) original_data{3}(8) original_data{4}(8)
    original_data{1}(9) original_data{2}(9) original_data{3}(9) original_data{4}(9)
    original_data{1}(10) original_data{2}(10) original_data{3}(10) original_data{4}(10)];
coordinate_list(:,1) = original_data{1}(11:length(original_data{1}));
coordinate_list(:,2) = original_data{2}(11:length(original_data{2}));
coordinate_list(:,3) = original_data{3}(11:length(original_data{3}));
coordinate_list(:,4) = 0;
coordinate_list(:,5) = original_data{4}(11:length(original_data{4}));

transformed_list = zeros(length(coordinate_list),5);
for i = 1:length(coordinate_list)
    if coordinate_list(i,1) == 0 && coordinate_list(i,2) == 0 && coordinate_list(i,3) == 0
        transformed_list(i,:) = NaN;
    else
        %transformed_list(i,:) = coordinate_list(i,:)*t_matrix;
        transformed_list((i:i),(1:4)) = coordinate_list((i:i),(1:4))*t_matrix;
        transformed_list(i,5) = coordinate_list(i,5);
    end
    %i
end

提前感谢

与其阅读整个文件,不如使用
fscanf(文件ID,'%f',7)

并在阅读时处理输入

与其读取整个文件,不如使用
fscanf(文件ID,'%f',7)

并在阅读时处理输入

for
带有类似条件语句的循环将需要很长时间才能运行。但是Matlab在循环速度方面的不足之处在于它通过矢量化和索引来弥补

让我们尝试一些类似这样的逻辑索引来解决第一步:

coordinate_list(coordinate_list(:,1) == 0 .* ...
                coordinate_list(:,2) == 0 .* ...
                coordinate_list(:,3) == 0)=nan;
然后将第二条语句矢量化:

transformed_list(:,(1:4)) = coordinate_list(:,(1:4))*t_matrix;
正如上面提到的EBH,这可能对您的RAM有点沉重。如果你的电脑无法处理,你会问自己坐标是否真的必须是双倍的,也许单精度就可以了。如果仍然不行,请尝试分割向量并分部分执行操作


举个小例子给你一个想法,因为我这里有一个200万元素的点云:

在R2015a中

transformed_list = zeros(length(coordinate_list),5);

tic
for i = 1:length(coordinate_list)
    if coordinate_list(i,1) == 0 && coordinate_list(i,2) == 0 && coordinate_list(i,3) == 0
        transformed_list(i,:) = NaN;
    else
        %transformed_list(i,:) = coordinate_list(i,:)*t_matrix;
        transformed_list((i:i),(1:3)) = coordinate_list((i:i),(1:3))*t_matrix;
        transformed_list(i,5) = 1;
    end
    %i
end
toc
返回
经过的时间为10.928142秒。

transformed_list=coordinate_list;
tic 

coordinate_list(coordinate_list(:,1) == 0 .* ...
                coordinate_list(:,2) == 0 .* ...
                coordinate_list(:,3) == 0)=nan;

transformed_list(:,(1:3)) = coordinate_list(:,(1:3))*t_matrix;


toc

返回
经过的时间为0.101696秒。
对于带有类似条件语句的循环,运行这些语句需要很长时间。但是Matlab在循环速度方面的不足之处在于它通过矢量化和索引来弥补

transformed_list=coordinate_list;
tic 

coordinate_list(coordinate_list(:,1) == 0 .* ...
                coordinate_list(:,2) == 0 .* ...
                coordinate_list(:,3) == 0)=nan;

transformed_list(:,(1:3)) = coordinate_list(:,(1:3))*t_matrix;


toc
让我们尝试一些类似这样的逻辑索引来解决第一步:

coordinate_list(coordinate_list(:,1) == 0 .* ...
                coordinate_list(:,2) == 0 .* ...
                coordinate_list(:,3) == 0)=nan;
然后将第二条语句矢量化:

transformed_list(:,(1:4)) = coordinate_list(:,(1:4))*t_matrix;
正如上面提到的EBH,这可能对您的RAM有点沉重。如果你的电脑无法处理,你会问自己坐标是否真的必须是双倍的,也许单精度就可以了。如果仍然不行,请尝试分割向量并分部分执行操作


举个小例子给你一个想法,因为我这里有一个200万元素的点云:

在R2015a中

transformed_list = zeros(length(coordinate_list),5);

tic
for i = 1:length(coordinate_list)
    if coordinate_list(i,1) == 0 && coordinate_list(i,2) == 0 && coordinate_list(i,3) == 0
        transformed_list(i,:) = NaN;
    else
        %transformed_list(i,:) = coordinate_list(i,:)*t_matrix;
        transformed_list((i:i),(1:3)) = coordinate_list((i:i),(1:3))*t_matrix;
        transformed_list(i,5) = 1;
    end
    %i
end
toc
返回
经过的时间为10.928142秒。

transformed_list=coordinate_list;
tic 

coordinate_list(coordinate_list(:,1) == 0 .* ...
                coordinate_list(:,2) == 0 .* ...
                coordinate_list(:,3) == 0)=nan;

transformed_list(:,(1:3)) = coordinate_list(:,(1:3))*t_matrix;


toc

返回
经过的时间为0.101696秒。

您是否有一个基准来支持此断言,或者您只是想让它自己运行?您是否有一个基准来支持此断言,或者您只是想让它自己运行?您的问题是什么?是否要加快数据导入或处理速度?导入30000000个点显然要花费大量时间,我不知道为什么这是一个值得关注的部分。“避免
for
循环”通常意味着矢量化,在如此大的矩阵上矢量化进程将需要大量内存。如果你没有足够的内存,你的MATLAB将永远挂起。。。因此,我不确定您是否真的想避免
for
循环。如果可能的话,我想加快数据导入和处理的速度。我正在一个工作站工作,我将尝试一些矢量化。你的问题是什么?是否要加快数据导入或处理速度?导入30000000个点显然要花费大量时间,我不知道为什么这是一个值得关注的部分。“避免
for
循环”通常意味着矢量化,在如此大的矩阵上矢量化进程将需要大量内存。如果你没有足够的内存,你的MATLAB将永远挂起。。。因此,我不确定您是否真的想避免
for
循环。如果可能的话,我想加快数据导入和处理的速度。我正在使用一个工作站,我将尝试一些矢量化。在提供基准测试时,包含版本号是很有帮助的。虽然很难打败矢量化运算的性能,但随着引擎的改进,MATLAB的循环速度越来越快。谢谢评论。我将尝试这些建议,并在完成编码后通知您。在提供基准测试时,包含版本号很有帮助。虽然很难打败矢量化运算的性能,但随着引擎的改进,MATLAB的循环速度越来越快。谢谢评论。我将尝试这些建议,并在完成编码后通知您。
transformed_list=coordinate_list;
tic 

coordinate_list(coordinate_list(:,1) == 0 .* ...
                coordinate_list(:,2) == 0 .* ...
                coordinate_list(:,3) == 0)=nan;

transformed_list(:,(1:3)) = coordinate_list(:,(1:3))*t_matrix;


toc