【问题标题】:do we need to make copy of matrix before calling lapack subroutines我们需要在调用 lapack 子程序之前复制矩阵吗
【发布时间】:2017-11-02 02:53:05
【问题描述】:

我正在解决一些中间步骤需要求解 Ax=b 线性系统的问题。我打算使用 lapack 通过使用 DGESV 之类的子程序来解决它。但是我发现 lapack 将矩阵“A”转换为“PLU”(一些较低和较高的矩阵格式)。我希望“A”在我未来的操作中完好无损。我是否需要在每次发送到 lapack 之前制作它的副本?复制“b”是可以的,但是,如果“A”很大,那么复制自身很耗时。有没有办法避免它或lapack的其他一些功能,以避免改变“A”。另外,如果复制是不可避免的,那么有没有一种有效的方法来实现它?我使用“C”作为编程语言。

【问题讨论】:

  • (1) 如果一个函数修改了一个数据结构,并且需要保留原来的内容,那么需要先复制它 (2) 复制一个矩阵所花费的时间相比于求解涉及该矩阵的线性系统所需的时间。
  • 您是否使用memcpy() 函数一次复制整个矩阵?它比使用 for 循环更有效。
  • 谢谢。我认为 lapack 有一些额外的输入参数可以将新信息存储到其他矩阵中。无论如何,如果不可能,那么正如弗朗西斯所建议的那样; memcpy() 是一个不错的选择。

标签: c lapack


【解决方案1】:

LAPACK 通常会尝试将结果存储在输入参数中,但在这里您希望 A 保持不变。

LAPACK 在内部也使用了一个工作数组。您基本上可以通过将原始元素读取到工作数组来遵循类似的路线。从一个固定的来源,可能是一个文件,或者只是将它保存在内存中,解决问题,获取系数,然后检索原始元素并将它们就地放置在同一个数组中。

【讨论】:

  • 如何与工作数组交互?你能简化你的答案吗?您的意思是,将 A 复制到某个数组,然后使用该数组。还是别的什么?
  • @user402940 我的意思是使用一个数组并不断更新它,模仿 LAPACK 例程的内部 WORK 数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-22
  • 2011-11-24
相关资源
最近更新 更多