22.1.4.2 运算符和函数的返回类型

使用稀疏矩阵的两个基本原因是减少内存使用量以及避免对零元素进行计算。这两者密切相关,因为稀疏矩阵运算符或函数的计算时间大致与非零元素的数量成线性关系。

因此,当矩阵中非零元素的密度达到一定程度时,继续将其存储为稀疏矩阵就不再合理,而应存储为满矩阵。基于这个原因,那些有很大概率返回满矩阵的运算符和函数将始终返回满矩阵。例如,向稀疏矩阵加上一个标量常数几乎总会使其变成满矩阵,因此下面的例子:

speye (3) + 0
⇒    1  0  0
   0  1  0
   0  0  1

返回的就是一个满矩阵,我们可以清楚地看到这一点。

由于满矩阵与稀疏矩阵之间的所有混合运算符和函数都是存在的,所以通常这不会引起任何问题。然而,确实会出现问题的一种情况是:当一个稀疏矩阵被提升为满矩阵后,后续操作又将其重新稀疏化。这类情况很少见,但可以人为构造,例如 (fliplr (speye (3)) + speye (3)) - speye (3) 在应该返回稀疏矩阵时却返回了满矩阵。一般来说,在出现这类情况时,它们只会造成很小的内存开销。

不过,有一个已知的情况中,Octave 稀疏矩阵的这种行为确实会引起问题,那就是对 diag 函数的处理。diag 根据输入参数的类型决定返回稀疏矩阵还是满矩阵。所以

 a = diag (sparse ([1,2,3]), -1);

应该返回一个稀疏矩阵。为了确保这一点确实成立,sparse 函数以及基于它的其他函数(如 speye)总是返回稀疏矩阵,即使其占用的内存会大于满矩阵表示形式。


版权所有 © 2024-2026 Octave中文网

ICP备案/许可证号:黑ICP备2024030411号-4