使用稀疏命令传回增加行索引的数据

Passing back data with increasing row indices using Sparse Command

默认情况下,稀疏命令传回按增加列索引排列的矩阵中的非零元素:

A = [ 0 0 1; 0 0 2; 0 2 1];

B = sparse(A)
B =

   (3,2)        2
   (1,3)        1
   (2,3)        2
   (3,3)        1

有没有办法改变它,让它在增加的行索引中传回稀疏矩阵?在这种情况下

    B =
       (1,3)        1
       (2,3)        2
       (3,2)        2
       (3,3)        1

我不这么认为。

原因是因为 MATLAB 将所有内容都存储为内部的一维向量,与矩阵的维度无关。这意味着您看到的值的实际索引是 [6 7 8 9] ,但 MATLAB 将它们更改为矩阵索引(使用 ind2sub)。

此外,在稀疏矩阵中只存储索引和值。因此,虽然在矩阵 A 中存储了所有内容,但 B 看起来像

ind=[6 7 8 9]
val=[2 1 2 1]

记忆中。

你唯一能做的实际上是 permuting/transposing 矩阵,但你会失去索引。但是,我不确定你想要他做什么,因为 MATLAB 只理解这种排序数据的方式。如果你想要它来绘图,那么你可以重新排序它们。

如果您希望 displayed 值具有递增的行索引,有一种方法,尽管有点 hackish:

  1. 使用 evalc.
  2. 捕获 sparse 的输出
  3. 这给出了一个由换行符分隔的字符串。将它分成不同的行并使用 char 水平连接它们(用空格填充)。这给出了一个二维字符数组。
  4. 对该数组的行进行排序,除了第一行(如果使用 format compact) or first three (if using format loose) with sortrows。这会使较小的行索引首先出现。您可能想要删除第一行或前三行(其中包含 ans = 和空白行)。
  5. 使用 disp.
  6. 显示

示例使用 format compact:

format compact
A = [ 0 0 1; 0 0 2; 0 2 1];         %// data
s = evalc('sparse(A)');             %// step 1
s = char(strsplit(s,'\n'));         %// step 2
s(2:end,:) = sortrows(s(2:end,:));  %// step 3, asuming format compact
disp(s)                             %// step 4

这给出了

ans =            

   (1,3)        1
   (2,3)        2
   (3,2)        2
   (3,3)        1