如何从法线向量和点绘制matlab或matplotlib中的平面?
今年夏天,我在图像/视频实验室里一直在我的大学工作.就在最近,我的教授给了我一个由毕业生写的程序,他刚离开程序"修理",因为它"给出了一些错误".
该项目是用C++编写的(似乎是学生代码中反复出现的坏标志).我在VS08中打开了项目,并运行了项目,事实证明,"错误"是一个bad_alloc.果然,内存管理,或更准确地说,缺乏内存管理,就是问题所在.
程序员似乎喜欢在整个代码中混合mallocs,news和new [],绝对没有free,delete或delete [].更糟糕的是,所有对象似乎至少做了4-5个不相关的事情.最重要的是,这是程序员留下的评论:
//do not delete objects, it seems to cause bugs in the segmenter
Run Code Online (Sandbox Code Playgroud)
从我所看到的,有一个很好的不健康的指针和引用的引用组合,所有的值都通过引用单个类函数来改变,这些函数也可能是静态的.在编译时,大约有23个警告 - 比如从double转换为char时可能丢失数据,大约17个未使用的变量等等.像我这样的时候我希望C++在大学中从不存在,并且所有实验室工作都是像python或matlab一样完成......
所以现在,教授希望我"弄乱"这个程序,这样它就可以运行大约比以前大10倍的数据集.我承认,我有点害怕告诉她代码是垃圾.
StackOverflow,你们之前从未失败过,提出好的建议,所以现在我恳求,任何关于处理这类情况的建议都会受到很多赞赏.
编辑 代码大约是5000 LoC
EDIT2 教授决定采用最简单的方法.哪个内存越来越多.是的,因为要在这个问题上投钱......
我正在开展一个项目,在这个项目中,我基本上可以在20-100分的基础上进行数百万次PCA.目前,我们正在使用一些使用GNU的GSL线性代数包的遗留代码在协方差矩阵上进行SVD.这有效,但速度很慢.
我想知道是否有任何简单的方法在3x3对称矩阵上进行特征分解,这样我就可以把它放在GPU上让它并行运行.
由于矩阵本身很小,我不确定使用什么样的算法,因为它们似乎是为大型矩阵或数据集设计的.还可以选择在数据集上进行直接SVD,但我不确定什么是最佳选择.
我不得不承认,我在线性代数方面并不是很出色,尤其是在考虑算法优势时.任何帮助将不胜感激.
(我现在正在使用C++)
我正在使用内核共享工作队列,我有一个delayed_work结构,我想重新安排立即运行.
以下代码是否会保证delayed_work将尽快运行?
cancel_delayed_work(work);
schedule_delayed_work(work, 0);
Run Code Online (Sandbox Code Playgroud)
在工作已经开始的情况下会发生什么?cancel_delayed_work将返回0,但我不确定schedule_delayed_work如果工作当前正在运行或未安排将会怎么做.
对于模糊的主题问题,我很抱歉,但我正在研究一些学术视频处理程序.这些算法是用MATLAB编写的,虽然它可以用于开发目的,但它处理的视频大约为60spf,或大约为0.0166fps.毋庸置疑,这对于演示等都不够,所以我的暑期工作就是将例行程序转换为运行速度极快的程序.
我已经重写了CUDA代码中最慢的部分,即nvidia的GPGPU解决方案.但是,还有很大一部分代码似乎在CPU上做得更好,因为它是相对串行的.问题是,我给的机器有2个Xeon处理器,共有8个逻辑核心,通过仅编码单核来编码GPU代码似乎是一种耻辱.视频转换过程的功能在于每个帧都不依赖于其他帧,所以我认为某种异步队列/流最好.
这就是我的问题:实现这种并行性的最佳方法是什么才能以最快的速度提高产量?
我看过的一些解决方案是OpenMP,.net TPL和简单的pthread.
我只对异步编程有基本的接触,所以我宁愿使用一个库或其他东西,而不是乱用互斥和障碍,并多次射击自己.我不介意学习,因为这是我今年夏天的目标之一,但与此同时,并行性很难.但是,如果速度差实际上非常明显,我愿意把头发拉出几个星期.:P
提前致谢.
因此,在OpenGL渲染应用程序中,通常最好在应用程序的整个生命周期中创建和维护顶点缓冲区,并且只使用glBufferData每帧交换数据,或者更好的方法是删除VBO并在每一帧重新创建它?
Intuition告诉我交换数据更好,但是我见过的一些示例程序是后者,所以我有点困惑.
我读过Nvidia关于VBO的白皮书,但由于我是opengl的新手,所以它没有多大意义.
在此先感谢您的建议
解析存储在ASCII中的大型浮点文件的最佳方法是什么?
最快的方法是什么?我记得有人告诉我使用ifstream很糟糕,因为它工作在少量字节上,最好先将文件读入内存.真的吗?
编辑:我在Windows上运行,文件格式用于存储在xyzrg b等行中的点云.我试图将它们读入数组.此外,文件大约每个20 MB,但我有大约10 GB的价值.
第二次编辑:每次我想要进行可视化时,我都要加载要显示的文件,所以尽可能快地加载它会很好,但老实说,如果ifstream预制合理,我不介意坚持可读代码.它现在运行速度很慢,但这可能比我在软件中可以做的更多硬件I/O限制,我只是想确认一下.
我现在已经在学校编程了一段时间,我正在开展我的第一个独立大项目.我一直在发现很多关于编程的东西,这些东西我以前都不知道,而且它很棒.
然而,越来越多,我觉得我不再把C++理解为一种语言,我越深入研究它.在继续之前,我想直接得到关于引用和指针的一些(错误)概念,我希望你,stackoverflow,如果我错了,可以纠正我.
在此先感谢,我们走了!
1.在类之间进行转换时,实际转换的是虚拟表.
例:
class A{
public:
A() : x(0) {};
int x;
virtual void doStuff() {
cout << x <<endl;
}
};
class B : public A{
public:
B() : y(1) {};
int y;
virtual void doStuff() {
cout << y <<endl;
}
};
Run Code Online (Sandbox Code Playgroud)
如果我已经将类型B的对象b转换为A,那么内部会发生什么,b的虚拟表将被丢弃,并被替换为类型A的相应虚拟表,并且y的析构函数将被调用,因为没有更长的参考.类似地,b中的doStuff将指向A :: doStuff的函数地址而不是B :: doStuff.但是,指向x的地址将保持不变.
这意味着利用多态性的唯一方法是通过指针和引用
作为第1点的结果,在类的虚方法中利用多态的唯一方法是使用引用和指针,因为如果我们通过值传递,类本身将自动转换为基类.
例:
void doALotOfStuff(A a1, A a2) {
a1.doStuff();
a2.doStuff();
}
int main(){
A a;
B b;
doALotOfStuff(a,b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
会打印出来的
0
0
Run Code Online (Sandbox Code Playgroud)
因为编译器会生成代码将b转换为A.
3.此外,利用数组和STL容器的这种多态性的唯一方法是使用指针,因为引用无法存储
由于向量不可分配,因为引用不可分配,因此如果我想要一个基类向量,我需要创建一个A的指针向量,以保留类型B的元素的虚拟表.
对不起,如果这是TL; …
可能重复:
MATLAB中的可扩展数据结构
所以在我目前的MATLAB脚本中,我有一个非常大的不确定大小的增长数组.目前我无能为力,因为如果我实际上预分配,它将需要比它应该需要的内存多很多倍的内存(最大可能的值是每像素640,但通常它是2的线上的东西5).
通常在这种情况下,我将使用C++中的向量或其他东西,它在给定容量方面呈指数级增长.但我认为Matlab中的矩阵开始碎片比目的驱动的C++向量快得多.
你们认为这是什么样的最佳选择?或者我应该坚持使用普通数组并希望顺序添加大约100k个元素会起作用吗?
提前致谢.
IE如果您有以下代码,会发生什么?
int mean(const vector<int> & data) {
int res = 0;
for(size_t i = 0; i< data.size(); i++) {
res += data[i];
}
return res/data.size();
}
vector<int> makeRandomData() {
vector<int> stuff;
int numInts = rand()%100;
for(int i = 0; i< numInts; i++) {
stuff.push_back(rand()%100);
}
}
void someRandomFunction() {
int results = mean(makeRandomData());
}
Run Code Online (Sandbox Code Playgroud)
我是否正确地认为C++将保留新创建的对象为平均生命,然后在它超出范围之后将其销毁?
此外,这如何工作/干扰RVO?
提前致谢.
编辑:添加const,忘了把它放进去.
我在搞清楚图像库时遇到了一些麻烦.
我找不到关于如何使用boost :: gil库中包含的interleaved_view函数的任何确切文档.更具体地说,我不确切知道原始数据应该存储在哪种二进制格式中.
我能找到的唯一提到的是在gil教程中:
// Calling with 8-bit RGB data into 16-bit BGR
void XGradientRGB8_BGR16(const unsigned char* src_pixels, ptrdiff_t src_row_bytes, int w, int h,
signed short* dst_pixels, ptrdiff_t dst_row_bytes) {
rgb8c_view_t src = interleaved_view(w,h,(const rgb8_pixel_t*)src_pixels,src_row_bytes);
rgb16s_view_t dst = interleaved_view(w,h,( rgb16s_pixel_t*)dst_pixels,dst_row_bytes);
x_gradient(src,dst);
}
Run Code Online (Sandbox Code Playgroud)
此外,功能原型说
template<typename Iterator>
type_from_x_iterator< Iterator>::view_t
boost::gil::interleaved_view (std::size_t width, std::size_t height, Iterator pixels, std::ptrdiff_t rowsize_in_bytes)
//Constructing image views from raw interleaved pixel data.
Run Code Online (Sandbox Code Playgroud)
我的问题是,gil在二进制格式中期望的格式是什么,以及rowsize_in_bytes应该是什么?
我之前看过交错图像的唯一一次是使用OpenGL,这只是每个像素彼此相邻存储的RGB信息.我认为rowsize_in_bytes只是字面上一行像素的大小,所以我尝试用这样写一个PNG:
void makeImage(const string fileName, const unsigned char * src, const int w, const …Run Code Online (Sandbox Code Playgroud) 我最近一直在研究一个点云播放器,理想情况下应该能够从激光雷达捕获中可视化地形数据点并以大约30fps的顺序显示它们.然而,我似乎已经因PCI-e IO而陷入困境.
我需要为每一帧做的是加载存储在内存中的大点云,然后根据高度计算颜色图(我使用的东西类似于matlab的喷射图),然后将数据传输到GPU.这适用于云捕获,点数<100万.然而,在大约200万点时,这开始减慢到每秒30帧以下.我意识到这是很多数据(每点200万帧*[每点3个浮点数+每个颜色点3个浮点数]*每个浮点数4个字节*每秒30帧=每秒约1.34千兆字节)
我的渲染代码现在看起来像这样:
glPointSize(ptSize);
glEnableClientState(GL_VERTEX_ARRAY);
if(colorflag) {
glEnableClientState(GL_COLOR_ARRAY);
} else {
glDisableClientState(GL_COLOR_ARRAY);
glColor3f(1,1,1);
}
glBindBuffer(GL_ARRAY_BUFFER, vbobj[VERT_OBJ]);
glBufferData(GL_ARRAY_BUFFER, cloudSize, vertData, GL_STREAM_DRAW);
glVertexPointer(3, GL_FLOAT, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, vbobj[COLOR_OBJ]);
glBufferData(GL_ARRAY_BUFFER, cloudSize, colorData, GL_STREAM_DRAW);
glColorPointer(3, GL_FLOAT, 0, 0);
glDrawArrays(GL_POINTS, 0, numPoints);
glDisableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, 0);
Run Code Online (Sandbox Code Playgroud)
每帧都会更改vertData和colorData的指针.
我希望能够做到的是,即使以后使用每帧可能达到700万点的大点云,也能够以每秒至少30帧的速度播放.这甚至可能吗?或者也许更容易网格化并构建高度图并以某种方式显示它?我对3D编程还很陌生,所以任何建议都会受到赞赏.
我在一些遗留代码中发现我正在处理这个函数(在C++中)
Vec3d Minimum()
{
if(this->valid)
{
return minBB;
}
else
{
return NULL;
}
}
Run Code Online (Sandbox Code Playgroud)
其中Vec3d是一个对象,它基本上是一个带有x,y,z和一些运算符重载的结构(下面的代码).
AFAIK,你不能为用户定义的对象返回0 ...或者是否有一些我不知道的自动转换为零?这只是出于好奇:p
谢谢
class Vec3d
{
public:
double x,y,z;
/// \brief Default constructor initializes x and y to 0
Vec3d();
/** \brief Constructor initializies vector to input parameters x and y and z
*
* \param x Double value that initializes x value of vector
* \param y Double value that initializes y value of vector
* \param z Double value that initializes z …Run Code Online (Sandbox Code Playgroud) c++ ×7
optimization ×3
matlab ×2
opengl ×2
reference ×2
3d ×1
algorithm ×1
arrays ×1
boost-gil ×1
casting ×1
cuda ×1
file-io ×1
ifstream ×1
io ×1
lidar ×1
linux-kernel ×1
maintenance ×1
matplotlib ×1
memory ×1
parsing ×1
performance ×1
plot ×1
png ×1
pointers ×1
polymorphism ×1
scipy ×1