使用稀疏命令传回增加行索引的数据
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:
- 使用
evalc
. 捕获 sparse
的输出
- 这给出了一个由换行符分隔的字符串。将它分成不同的行并使用
char
水平连接它们(用空格填充)。这给出了一个二维字符数组。
- 对该数组的行进行排序,除了第一行(如果使用
format
compact
) or first three (if using format loose
) with sortrows
。这会使较小的行索引首先出现。您可能想要删除第一行或前三行(其中包含 ans =
和空白行)。
- 使用
disp
. 显示
示例使用 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
默认情况下,稀疏命令传回按增加列索引排列的矩阵中的非零元素:
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:
- 使用
evalc
. 捕获 - 这给出了一个由换行符分隔的字符串。将它分成不同的行并使用
char
水平连接它们(用空格填充)。这给出了一个二维字符数组。 - 对该数组的行进行排序,除了第一行(如果使用
format
compact
) or first three (if usingformat loose
) withsortrows
。这会使较小的行索引首先出现。您可能想要删除第一行或前三行(其中包含ans =
和空白行)。 - 使用
disp
. 显示
sparse
的输出
示例使用 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