我正在使用大数组(大约6x40万)并且我的代码显示出很大的瓶颈.我在MatLab中经验丰富,但对内部过程(如内存等)知之甚少.
我的代码如下所示(只是必需品,当然所有变量都被初始化,特别是循环中的数组,我只是不想用代码轰炸你们所有人):
首先我读了这个文件,
disp('Point cloud import and subsampling')
tic
fid=fopen(strcat(Name,'.dat'));
C=textscan(fid, '%d%d%f%f%f%d'); %<= Big!
fclose(fid);
Run Code Online (Sandbox Code Playgroud)
然后从内容中创建数组,
y=C{1}(1:Subsampling:end)/Subsampling;
x=C{2}(1:Subsampling:end)/Subsampling;
%... and so on for the other rows
clear C %No one wants 400+ millon doubles just lying around.
Run Code Online (Sandbox Code Playgroud)
并清除单元格数组(1),并使用新值创建一些图像和数组
for i=1:length(x)
PCImage(y(i)+SubSize(1)-maxy+1,x(i)+1-minx)=Reflectanse(i);
PixelCoordinates(y(i)+SubSize(1)-maxy+1,x(i)+1-minx,:)=Coordinates(i,:);
end
toc
Run Code Online (Sandbox Code Playgroud)
在此之前,所有东西都或多或少地运行,但随后我操纵了一些数组
disp('Overlap alignment')
tic
PCImage=PCImage(:,[1:maxx/2-Overlap,maxx/2:end-Overlap]); %-30 overlap?
PixelCoordinates=PixelCoordinates(:,[1:maxx/2-Overlap,maxx/2:end-Overlap],:);
Sphere=Sphere(:,[1:maxx/2-Overlap,maxx/2:end-Overlap],:);
toc
Run Code Online (Sandbox Code Playgroud)
这是一个很大的瓶颈,但下一步会变得更糟
disp('Planar view and point cloud matching')
tic
CompImage=zeros(max(SubSize(1),PCSize(1)),max(SubSize(2),PCSize(2)),3);
CompImage(1:SubSize(1),1:SubSize(2),2)=Subimage; %ExportImage Cyan
CompImage(1:SubSize(1),1:SubSize(2),3)=Subimage;
CompImage(1:PCSize(1),1:PCSize(2),1)=PCImage; %PointCloudImage Red
toc
Run Code Online (Sandbox Code Playgroud)
产量
点云导入和子采样
经过的时间是181.157182秒.
重叠对齐
经过的时间是408.750932秒.
平面视图和点云匹配
经过的时间是719.383807秒. …
我在图像中检测到一个显着区域,我执行了一系列操作,最重要的是仿射归一化(将椭圆转换为圆形,将梯形转换为等边矩形).
仿射归一化是矩阵中剪切和缩放的组合,如下所示:
Chol=[a,b
0,c]
Run Code Online (Sandbox Code Playgroud)
a,[0,1]中的c和[-1,1]中的b(对于那些感兴趣的人,它是检测到的区域的协方差矩阵的Cholesky分解的逆矩阵).
一切正常,直到这里,但是当我将变换应用到原始帧时
AffineFrame=cv.warpAffine(RealFrame,[Chol,[0;0]],...
'DSize',[RealFrameSize(1),RealFrameSize(2)]);
% that's dst=cv.warpAffine(src,trafo) with trafo: 2x3 Matrix (here Chol and [0,0] translation)
Run Code Online (Sandbox Code Playgroud)
我得到一个未缩放的图像,转换和图像大小: .
我真正想要的是 - 并且通过这条线的试错来实现这个特定的框架
AffineFrame=cv.warpAffine(RealFrame,[Chol,[0;0]]*S,...
'DSize',[RealFrameSize(1)*X,RealFrameSize(2)*Y]);
Run Code Online (Sandbox Code Playgroud)
看起来像这样:
.
我知道问题在于缩放S
,X
和Y
.如果有人知道如何计算这个,你将节省我回到学校几何的漫长旅程!(我已经拥有了可以从第二个图像时刻中提取的所有几何信息,如市长和短轴,各自的幅度,偏心率等等.)
编辑:一些典型值(不一定是这种情况):
Chol = 0.43 -0.23
0 0.67
Run Code Online (Sandbox Code Playgroud)
这个想法我有X
和Y
:与L
和W
主轴线和次轴线的大小(变化很大,这取决于形状通常约5和50):
X=(1+L/(L+W));
Y=(1+W/(L+W));
Run Code Online (Sandbox Code Playgroud)
仅当剪切Chol
不大时才有效.S
取决于形状,在5到30之间做得很好.
我正在绘制两个场景之间的功能匹配,如下所示:
%...import, preprocessing, and stuff
%"Sandwich" Image1 and Image2 in a new image Image
ImSize=[size(Image1,1)+size(Image2,1),max(size(Image2,2),size(Image2,2))];
Image=zeros(ImSize);
Image(1:size(Image1,1),1:size(Image1,2))=Image1;
Image(size(Image1,1)+1:end,1:size(Image2,2))=Image2;
%show Image
imshow(Image,[]);
hold on
%plot keypoints and matching lines in all colors
cc=hsv(size(Keypoints1,1));
for ii=1:size(Keypoints1,1)
plot(Keypoints1(ii,1),Keypoints1(ii,2),'o','color',cc(ii,:))
plot(Keypoints2(ii,1),Keypoints2(ii,2)+size(Image1,1),'o','color',cc(ii,:))
line([Keypoints1(ii,1),Keypoints2(ii,1)],[Keypoints1(ii,2),Keypoints2(ii,2)+size(Image1,1)],'color',cc(ii,:),'LineWidth',0.5)
end
Run Code Online (Sandbox Code Playgroud)
这个正常工作正常,Matlab绘制了整个bitdepth
但随着行数的增加,我将开始看到导致二进制图像甚至全黑的bitdepth减少:
我知道密谋这么多线远非理想,但我仍然想知道为什么会这样.是否有任何matlab数据机制我应该理解解释这种行为?
注意:这只是显示图像的问题,将它们保存为.bmp,jpg,...将生成正常图片.
我想创建一个html文件来打印包含一个文件夹中所有功能的讲义.有没有办法以编程方式访问每个函数的帮助,以准备字符串输入?
getfunchelp()
在这样的程序中,我正在思考虚构的事情:
Functions=dir('*.m');
fid = fopen('FunctionSummary.htm','a');
fprintf(fid, ['<HTML><HEAD><TITLE> Function Summary </TITLE>\n']);
for ii=1:length(Functions)
FunctionName=Functions(ii).name;
FunctionHelp=getfunchelp(FunctionName); % <= This one over here
fprintf(fid, ['<H2>',FunctionName,'</H2>']);
fprintf(fid, ['\n<BR><i>',FunctionHelp,'</i> ']);
%...
end
fclose(fid);
Run Code Online (Sandbox Code Playgroud)
或者有更好的方法吗?(如果publish()
不打印其余的功能代码,可以更容易实现吗?)