百科问答小站 logo
百科问答小站 font logo



在 C++ 里实现矩阵库的关键点是什么? 第1页

  

user avatar   astrojhgu 网友的相关建议: 
      

Change Log: 最后一条关于乘法复杂度的条目有误,已更正。


一、接口怎么设计:

  1. 是准备只做线性代数矩阵库还是要做n-dimensional array lib (e.g., blitz++)?
  2. 如果只做矩阵库,向量和矩阵要不要分成不同的class?是干脆就用不同的class还是用继承?是basematrix下面分matrix还是直接用matrix作为基类,向量派生出来?行向量和列向量要不要分开?
  3. 要不要支持sparse矩阵?
  4. Dense和sparse矩阵要不要提供统一的接口?要不要采用pimp方式实现还是采用template实现?
  5. 要不要分别实现raw-major和col-major storage order?是分别以不同的sub-class给出还是用同一个类,但是构造的时候给参数,还是用template parameter给出?
  6. index操作是采用[][]还是采用operator()(i,j)?
  7. 对于[][]或者(i,j), const情况下是返回值还是返回&?如果返回&的话,对于sparse matrix怎么处理?对于非const的情况,一般会选择返回&,那么sparse matrix 是不是也返回&?访问0元素的时候怎么办(存在一个修改0元素的问题)?
  8. 要不要提供各种slice操作?
  9. 要不要提供各种分块的view?
  10. 要不要区分ArrayRef和Array?
  11. 要不要提供iterator?
  12. 计算效率问题,要不要做/怎么做和lapack/blas的接口?
  13. 要不要可以reshape, resize?要不要可以扩充列、行?


二、行为设计:

  1. 要不要提供越界检查?
  2. 复制的时候是直接复制还是采用copy-on-write?
  3. 如果试图写入sparse matrix的0值元素,是报错,还是变0值元素为非零值元素?


三、内部实现:

  1. 如果采用[][]的话第一个[]返回的代理对象怎么设计?
  2. 如果采用cow,内容如何在handler之间共享?std::shared_ptr还是自己实现一个?
  3. 要不要用expression template避免不必要的赋值,提高算数运算的效率?(blitz++)
  4. @D Flip Flop@Curiosity 指正,这一条我可能说错了。据说实践上矩阵乘法就是按照n^3的复杂度实现的,加速通过优化完成。(此条原文:矩阵相乘记得别写成简单粗暴的O(n^3),好像能达到O(n^2.7)?)。



  

相关话题

  对于一个大一计科新生,有什么代码行数在 500~1000 的程序(C 语言)可以试着写来练手? 
  如何看待《中国科学报》刊文评论美女数学博士后获奥运冠军:其实没啥了不起? 
  请问一下数学上是否有什么定理已经被证明,但是还没找到相对应的例子(实例)? 
  格兰杰因果检验(Granger causality test)是否犯了逻辑上的后此谬误? 
  怎样理解C语言是才是代码的精髓,可以让你领略不一样的世界这句话?(其实就是怎么翻译成人话-_-# 
  用5,5,5,7四个数字怎么算24点? 
  在理想状态下,CPU需不需要工作在一个时钟下? 
  请问这两个数分不等式如何证明? 
  有哪些形式简单却很难证明的不等式? 
  《JoJo的奇妙冒险 2》中大结局里卡兹被岩浆喷上外太空是否科学? 

前一个讨论
分块矩阵的秩的问题如何理解呢?
下一个讨论
用键盘弹钢琴是“亵渎经典”还是“另辟蹊径”?





© 2025-03-25 - tinynew.org. All Rights Reserved.
© 2025-03-25 - tinynew.org. 保留所有权利