【发布时间】:2015-11-02 08:03:01
【问题描述】:
我有一个MxM 矩阵S,它的对角线上的元素为零,其他地方都非零。我需要制作一个更大的块矩阵。这些块的大小为NxN,其中有MxM。
(i,j)th 块将是 S(i,j)I,其中 I=eye(N) 是 NxN 标识。这个矩阵肯定是稀疏的,S 有M^2-M 非零条目,我的块矩阵将有N(M^2-M) 出(NM)^2 或大约1/N% 非零条目,但我会将它添加到另一个@987654335 @矩阵,我不希望是稀疏的。
由于我要将块矩阵添加到完整矩阵中,尝试以“稀疏”方式编写代码是否会提高速度?我一直来回走动,但是我的想法是:即使我将S 转换为稀疏块矩阵的代码效率不高,当我告诉它将完整和稀疏矩阵相加时,MATLAB 不会知道它只需要迭代在非零元素上?我已经接受过培训,for 循环在 MATLAB 中很慢,而repmat 和用零填充之类的东西更快,但我的猜测是,最快的做法是根本不构建块矩阵,但是编写代码,以稀疏的方式将(小矩阵)S 的条目添加到我的另一个(大,完整)矩阵中。如果我要学习如何使用稀疏代码构建块矩阵(比完全构建它并将其传递给sparse 更快),那么该代码应该能够以稀疏的方式为我做加法,甚至不需要需要构建块矩阵吗?
【问题讨论】:
-
N和M有多大? (注意:我认为你会有N*(M^2-M)非零条目而不是M^2-M。) -
如果只有对角线为零,那么这不是很稀疏。与稀疏矩阵相关的额外开销将导致它在这种情况下需要更多内存。
-
This answer 建议您需要分配低于 25% 的稀疏矩阵才能看到性能的改进。但实际上,我认为确定它是否会对您的情况产生影响的唯一方法是实现您正在运行的任何算法的最小版本并对其计时。在不知道您对矩阵执行的确切操作的情况下,我认为我们不可能提供确凿的答案。
-
正如他们在这里所说的:如果您的非零数量大于条目的 25%,请不要为稀疏而烦恼。
-
@BillBokeey Ohp...你是对的。
S有M^2-M非零条目,它将对应于 1 到 N 与我的新矩阵的非零条目。起初我希望能够处理多达N~1,000和M~10,000,但快速计算表明我的完整NMxNM矩阵将具有1e14条目,即~100 TB。
标签: performance matlab sparse-matrix