Matlab - 将稀疏矩阵转换为复稀疏矩阵

时间:2017-02-14 09:07:30

标签: matlab

我有稀疏矩阵A,我需要通过将其虚部设置为零来转换为复稀疏矩阵。

A = sprand(3,3,0.5);
A_c = complex(A,0);

但是,这会引发一个A应该已满的错误。

  

使用复杂

时出错      

实际输入A必须是数字,真实和完整。

有没有解决这个问题的方法?

1 个答案:

答案 0 :(得分:3)

当我第一次回答这个问题时,我没有考虑在MATLAB中实现复杂稀疏矩阵的方式。我欺骗自己进入下面的答案。

天真的解决方案

您可以将complex()应用于矩阵的每个元素。

A_c = spfun(@(x)complex(x,0),A)

此处@(x)complex(x,0)表示应用于矩阵x的每个元素A的匿名函数,返回带有Re=xIm=0的复数。 spfun只返回一个新的稀疏矩阵,该矩阵是通过将我们的匿名函数应用于矩阵A的非零元素而生成的。

该解决方案会返回与原始矩阵相同的对象。矩阵A_c占用相同的字节数,并且等于原始矩阵A

>> whos A A_c
Variables in the current scope:

   Attr Name        Size                     Bytes  Class
   ==== ====        ====                     =====  =====
        A           3x3                         76  double
        A_c         3x3                         76  double

来自Florian Roemer的评论让我重新考虑我的答案。

解释

MATLAB中稀疏矩阵的表示在1991年出版的paper by Gilbert, Moler and Schreiber中有所描述。

实矩阵表示为按列顺序存储的相应存储类(即双精度或复数)的非零元素的单个向量加上各自列中这些元素的索引的整数向量加上整数向量新列开始的位置索引。即具有m*n非零元素的k稀疏矩阵将占用n * 4 + k * 12个字节,其中4个字节用于整数,8个字节用于存储实数作为双精度。这是一个3x3实数稀疏矩阵,有5个非零项占用(4 + 5)* 4 + 8 * 5 = 76个字节。

复杂的稀疏矩阵将为矩阵的所有非零项的虚部提供另一个实数数组,但仅当至少一个元素具有非零虚部时。

考虑

>> B = sprand(3,3,0.5)
B =    
Compressed Column Sparse (rows = 3, cols = 3, nnz = 5 [56%])    
  (1, 1) ->  0.46883
  ....
>> B_c = B ; B_c(1,1) += 1e-100i
B_c =
Compressed Column Sparse (rows = 3, cols = 3, nnz = 5 [56%])
   (1, 1) ->  4.6883e-01 + 1.0000e-100i
    ....

现在我们已经让MATLAB为原始矩阵的每个非零条目的虚部分配额外的存储空间,即使只有一个条目具有非零虚部。

>> whos B B_c
Variables in the current scope:

   Attr Name        Size                     Bytes  Class
   ==== ====        ====                     =====  =====
        B           3x3                         76  double
   c    B_c         3x3                        116  double

现在B_c是一个适当的复杂稀疏矩阵,占据

   (4+5)*4 + 8 * 5 + 8 * 5 = 116 bytes

结论

如果你只需要一个零虚部的稀疏矩阵,那么对原始矩阵不做任何事。

如果您需要一个实际为复杂条目分配存储的矩阵并携带complex属性,则将一个小的虚构值添加到原始矩阵的至少一个非零条目中。

Matlab评论:我没有在实际的Matlab中对此进行测试,但Octave对此解决方案非常满意。