matlab中的稀疏矩阵:将未记录的元素设置为-1而不是0

时间:2015-09-07 18:03:27

标签: matlab coding-efficiency

我想创建一个主要由-1组成的稀疏矩阵,但也包含一些0和1.这是一个较大项目的一部分,所以重要的是我不要用0切换-1。默认情况下,稀疏(A)在Matlab中仅跟踪非零元素。有没有办法只跟踪非(减一)元素?例如,如果

A = 
-1 -1 -1  0 
 1 -1 -1 -1

然后

new_sparse(A) =
(1,4) = 0
(2,1) = 1

谢谢!

1 个答案:

答案 0 :(得分:1)

不,无法覆盖sparse以使用不同的值。尽管耗费时间和内存,但您可以使用accumarray

x_ind; % I presume this to contain the column index of the number
y_ind; % I presume this to contain the row  index of the number
value; % I presume this to contain the value (0 or 1)
new_mat = accumarray([x_ind y_ind],value,[],[],-1);

new_mat现在将包含您指定的01值,并且在所有其他位置都包含-1。您不必设置size参数(第三个),因为如果您放置max(x_ind) x max(y_ind),它只会创建[]大小的矩阵。第四个输入参数(函数)也可以为空,因为x_indy_ind的每个组合只包含一个值,因此默认值mean就足够了。

一个例子:

A = [0 1 ; -1 0];
x_ind = [1;2;2];
y_ind = [1;1;2];
value = [0;1;0];
new_mat = accumarray([x_ind y_ind],value,[],[],-1);

new_mat = 
          0    1
          -1   0

我喜欢的另一种方法是简单地在所有值中添加一个,从而使你的1 2并将你的0设置为1.这样-1被映射到0,因此你清楚了无论如何要使用sparse。在示例中,这将设置A = [1 2;0 1],您可以使用A-1使用相应的值调用它。

正如注释:sparse为每个元素(行,列,值)存储三个值,加上一些开销。因此,如果您的矩阵空白少于70%,那么sparse实际上比常规的完整矩阵消耗更多内存。