Lost Ferry

来源: BlogBus 原始链接: http://ferryslife.blogbus.com/s40813/index.html 存档链接: https://web.archive.org/web/20061109224828id_/http://ferryslife.blogbus.com/s40813/index.html


Lost Ferry 野渡无人舟自横 .: 日历 :. .: 快速登录 :. .: 最后更新 :. .:

最新评论 :. .:

存档 :. .:

我的链接 :. .:

扩展功能 :. :: 首页 分页: Java和脚本,C++和Matlab

  • [ Lost_Time 程序设计 ] 给 Java SE 注入脚本语言的活力 发现跟C++里调用Matlab很类似。主要操作都是打开engine,调用eval,传变量,取变量。 昨天花了大半天学会怎么从C++里调用Matlab。其实一两年前试图搞过,结果没搞出来。后来就到处找C++矩阵类库,发现几乎全是垃圾,换了一个又一个,最终发现还不如用OpenCV自带的矩阵库,虽然也很恶心,而且是很多年前的了。初始化不方便,任何操作都不方便,当初也就看上了它有SVD函数,而且OpenCV很多函数也需要使用矩阵。不过前两天搞research又与一个老问题重逢,就是矩阵分解,M = KR。K是一个上三角矩阵,R是一个Orthogonal的矩阵。这个分解需要用到QR-Decomposition(nnd,突然意识到我的方法好像有问题?)。总之,OpenCV没有那个分解函数。自己写一个总觉得是件很恐怖的事情,没有信心。想起来一两个月前Li wenfeng发信说过可以在c++里调用matlab了,于是去问了一番,把源代码要过来。发现很简单,wk~。不过自己试了半天还是出链接错。不过现在知道链接错该怎么解决了,两年来C++还是有稍许进步。于是顺利的调试通过。其实还是花了相当大工夫,后来发现是搞混了mwArray和mxArray,被搞惨了。 在C++里调用Matlab还是相当激动人心的,很多事情C++做起来很麻烦,很丑陋,很容易出错,很难以维护,很难以调试,甚至根本做不到。比如实习时用的很多的图表绘制,用Matlab简直太方便了。觉得以后应该尽量用Matlab写核心代码,而C++可以负责开销大的操作,比如point correspondence,比如图像操作,或者一些简单的矩阵运算,另外可以负责GUI,也就是Matlab的弱项。其实现在用C++写代码也很快,因为自己已经有了很多类库的积累。不过自己的C++代码从不考虑内存泄漏问题,泄漏就泄漏吧,反正又不是写给别人,不想花那个精力。 有一个担忧是,Matlab用多了可能会上瘾。写起来确实很爽,但有一天因为性能的问题必须写成C++怎么办?port起来恐怕不是件很容易的事情。相当初构建一些简单的geometry的类都整得吐血。 另外,最大的问题仍然是执行效率问题。每次启动engine都暴慢,这个让人很难受。 无论如何,混合编程肯定是必要的。其实前天晚上就用了一个点子,在C++程序里输出.m文件,然后在matlab里调用,发现相当爽。不过要进一步就非得在C++里直接调用Matlab不可了。 在暑假实习之前,基本上从来不用Matlab,因为最开始必须用C++实现一些东西,以控制机器人。后来也就习惯用C++了,而且也觉得Matlab不是面向对象的语言,这一点很丑陋,不能容忍。这次暑假实习,基本上算是第一次好好学习了一下Matlab,上次学习大概是六七年前的大三了。虽然Matlab用得不多,但发现对research很有帮助,相当有帮助。核心的idea很容易实现,在evaluate不同的算法时也非常方便,可以方便的Plot,输出中间结果,那些图表不仅直观,还可以直接拿来放到各种文档里。不仅如此,后来还发现Matlab其实也可以“面向对象”的,不过不是它所提供的面向对象的方式,也不是类似于传统面向对象语言的那种方式。比如可以利用函数对象来实现多态。那时才明白为什么research都用matlab,实现到产品时才port到c++。相同的算法,用matlab可能只要几十行,一个下午就可以搞定,而用c++可能要几百几千行,要好几天。调试和改进matlab也更有优势。 每个语言都有适用的领域,每个领域都有适用的语言。没有哪一个语言可以在所有领域都是最好的。简单的,合适的,才是最好的。而简单的,合适的,是与领域相关的。当然,也和个人对语言的把握相关。 语言之间的融合,似乎是大势所趋 ferryzhou 发表于 2006-11-01 15:27:41 | 阅读全文 | 评论(0) | 引用(trackback0) | 编辑 Beyond Java
  • [ 断章截句 程序设计 ] http://www.theserverside.com/news/thread.tss?thread_id=37121 Bruce Tate的新书,连Joel都专门推荐过。这个帖子超长,估计比那本书都长了。Bruce Tate也参与了讨论,说话简洁明了有说服力,就像说的下面这句话: As to quick and dirty, I used Java because it was clean, although slow. I didn't use PHP or Perl because I think they are quick and dirty. I think Ruby on Rails is quick and clean. ferryzhou 发表于 2006-10-26 07:41:58 | 阅读全文 | 评论(0) | 引用(trackback0) | 编辑 又折腾了一个多小时
  • [ Lost_Time 程序设计 ] OpenCV + DirectShow http://www.site.uottawa.ca/~laganier/tutorial/opencv+directshow/ 例子编译通过 自己重写时出现下面的错误 ui error LNK2001: unresolved external symbol _CLSID_ProxyTransform ui error LNK2001: unresolved external symbol _IID_IProxyTransform ui fatal error LNK1120: 2 unresolved externals 。。。。 一条条比较project settings,改成完全相同,还是报错 google没有找到答案 想了半天,把例子中相关的两个文件include近来,并把自己相关的代码注释掉,编译通过! 注释的代码改回,把加入的两个文件去掉,又报错! 把两个文件又加进来,通过!wk~ 把头文件的相关代码注释掉,通过! 把文件去掉,报错! 包含进来,通过! 把#include全注释掉,报错! 逐段排除,发现是 #include "iproxytrans.h" #include "proxytransuids.h" 加入我的主文件,报错! 加入到另外一个文件,通过!wk~ 把新加入的两个文件又去掉,报错!不过稍微不一样,只有 ui error LNK2001: unresolved external symbol _IID_IProxyTransform 加入,通过! 把加入的cpp文件中的#include 添加到我的文件,去掉两个加入文件,抱错! 文件再加入,通过! 终于明白: 如果这样写: #include "initguid.h" #include "iproxytrans.h " #include "proxytransuids.h" 报错! 如果这样写: #include "initguid.h" #include "iproxytrans.h" #include "proxytransuids.h" 通过! wk~! 不好意思,应该这样写就会报错: #include "iproxytrans.h" #include "proxytransuids.h" #include "initguid.h" ferryzhou 发表于 2006-10-19 13:50:48 | 阅读全文 | 评论(0) | 引用(trackback0) | 编辑 ClassLoader
  • [ 程序设计 Lost_Time ] 刚开始搞飞机就被一个问题恶心得要吐血 用rome解析rss feeds 就两行代码,结果老是报exception 开始以为是文件找不到,copy过来过去也没用 后来发现是ClassLoader classLoader = PluginManager.class.getClassLoader()返回null,wk~ 用jcreator试sample竟然就没这个问题了,wk~ 搜了半天,也没找到解决之道。大多数是改一下程序,但rome是第三方类库,虽然开源也可以改,但是该人家的东西终究不是一个好的办法,肯定有什么地方可以配置一下的。 又搜到这个问题曾经列在sun的bug列表里面,结果状态是closed! no plan to fix. wk~ 实在受不了,洗了个澡,回头再搞 一种方法是放弃eclipse开发,全改用jcreator,但是目录的设置又太麻烦,涉及到很多外部文件的读取。况且eclipse在某些方面还是方便一些的。 想起来似乎跟bootstrap class loader有关 开始怀疑跟jdk设置有关,后来发现jcreator和eclipse使用的是相同的jre 跑到eclipse的run...设置选项里,点到classpath一栏,竟然看到Bootstrap Entries!看来就是这儿了。把相关的包删除,然后添加到User Entries,就ok了!wk~ ferryzhou 发表于 2006-10-05 14:30:50 | 阅读全文 | 评论(0) | 引用(trackback0) | 编辑 类库
  • [ 程序设计 Research ] 回来后发现干什么都不顺手 写个小程序都很不爽 需要一个Observer模式 原先在sharp把Observer放在bp包里了 现在两个选择: 一、用sharp包里的Observer 二、复制粘贴重新创建一个Observer 这两个选择都令人不爽 而标准c++又不包含这些模式 昨天基本上没干成什么事情 后来醒悟 发现需要创建一个属于自己的类库 其实在sharp写的东西有很多也可以抽取出来作为可复用类库 以前搞3D reconstruction也可以抽出大部分作为类库 大部分与自己的工作相关 比如video/image processing,matrix,multiple view geometry等等 另外则是通用库 比如设计模式、string,math等等 其实N年前就有类似的想法 但是限于自身技术的不足 只能做到源代码级的复用 后来用Java,复用方式非常直接 现在用static library,类似于java的复用方式 其实还有一个恶心的问题 有一些东西是从sharp包里抽取出来的 而sharp包里的那一块还得留着,并单独开发 因为涉及到版权问题 我不能将其命名为ferry::xxx之类 所以得同时维护两个不同版本而内容几乎一样的类库 似乎是无可避免的重复 ferryzhou 发表于 2006-08-24 01:16:11 | 阅读全文 | 评论(0) | 引用(trackback0) | 编辑 vc6里的function template
  • [ Lost_Time 程序设计 ] http://www.velocityreviews.com/forums/t281200-vc6-function-template-problem.html 恶心,相当恶心 里的min max也不支持 CString的SetString函数也没有 Louie该买套vc.net了,不然每个星期我都要恶心N次。 ferryzhou 发表于 2006-08-11 08:57:16 | 阅读全文 | 评论(0) | 引用(trackback0) | 编辑 The C++ Programming Language 摘抄
  • [ 程序设计 断章截句 ] any verbose and tedious solution is error-prone because programmers get bored. the fundamental aim of the error-handling techniques is to pass information about an error from the original point of detection to a point where there is sufficient information available to recover from the problem, and to do so reliably and conveniently. ferryzhou 发表于 2006-07-13 09:50:59 | 阅读全文 | 评论(0) | 引用(trackback0) | 编辑 乱七八糟的问题总结
  • [ 程序设计 Lost_Time ] //这两天忙晕了,估计还要一直晕下去 //一坨接一坨的问题,都因为恶心的c++ 首先,编译报这个错: ui error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits,class std::allocator >::basic_string<char,struct std::char_traits,class std::allocator >(void)" ( ??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ ) already defined in bp.lib(DistortionAnalysis.obj) 还有两个warnings: ui warning LNK4098: defaultlib 'LIBCD' conflicts with use of other libs; use /NODEFAULTLIB:library ui warning LNK4098: defaultlib 'LIBCMTD' conflicts with use of other libs; use /NODEFAULTLIB:library 解决方案,重新配置library的project,Property->C/C++->Code Generation->Runtime Library-> Multi-threaded Debug DLL (/MDd),也就是得跟使用它的project的配置一样,而且是一模一样,仅仅将单线程改称多线程是不行的。我开始幻想是代码本身的问题,到处搜,结果证明是白费力气。include 一个,一个都会导致相同的问题。 不过两个warnings继续存在。但也不能按照提示改成/NODEFAULTLIB,那样只会导致铺天盖地的错误。 今天早上过来,把vsnet所有project配置转换到vc6。没办法,Louie用的是vc6。而sharp给我配的新PC里面什么都没有,没有vc,matlab都没有。实在很难想象一个搞图像处理的lab竟然不缺省提供这些软件。我的laptop上只有vsnet,没有vc6,总不能装个盗版吧?Louie把他的一台老laptop借给我,上面有vc6。于是每次在我的机器上用vsnet开发完程序,都得再切换到Louie的机器,用vc6建立相同的项目,确保编译成功,运行也成功。而今天,不仅编译失败,编译成功后运行也出现诡异的问题。 编译失败主要是因为CString的GetBuffer函数在vc6里面还多了一个参数。另外还有一个小错误关于const的,不记得了。编译顺利完成,但冒一堆的warnings,我也懒得管。编译成功后,运行程序,发现不管点啥一点变化都没有。调试了半天,发现的问题。find函数返回总是空。怀疑是xx_map["yy"] = zz的问题 http://www.webasp.net/article/28/27697.htm 但改成insert也不行,中间还冒出了更多的问题,make_pair不支持。调试到stl的源码也看不出什么问题,准确地说基本上被stl的源码恶心坏了。基本问题是这样的:我插入一个pair<const char*, const char*>,比如("aa", "bb"),但是find("aa")就返回end()了,也就是说没找到。但是vsnet是可以找到的。我开始以为插入出了问题。后来发现插入后size是变成1了的,也就是说没问题。终于意识到是指针的问题。如果这样,const char* c = "aa",再插入(c, "bb"),再find(c)就成功了,wk。也就是说,vc6里的似乎不提供const char类型的比较,也许直接用==操作了。 还好,这个问题不难解决。就是把原本#define语句改称const char的定义语句。其实最早就这么干的,但后来冒编译错误,就全改成省事的#define。要改回来当然得碰到同样的错误。问题是这样的:要在namespace里定义全局变量。花了老半天找到解决方案:在头文件里,extern const char* A; 在cpp文件里,extern const char* A = "aa"。少了任何一个extern都会冒错,可能单个文件单个项目编译时不冒错,但到了其它的项目就会冒链接错。 http://www-inolab.sys.es.osaka-u.ac.jp/users/kanaya/a_better_c.html 以前的解决方案是把变量放到类里。在头文件class T {static const char* A;};然后cpp文件里const char* T::A = "aa"。没有extern。不过每次调用都得这样:T::A,不爽。 还有一些残余问题,nnd。 ferryzhou 发表于 2006-07-13 08:29:13 | 阅读全文 | 评论(0) | 引用(trackback0) | 编辑 分页: 风格设计: someok