我在Matlab中有一个稀疏矩阵。我希望将行中1的位置保存在行中和列中。
例如,考虑以下矩阵:
0 1 0 1 0
0 0 0 1 0
0 0 0 0 0
0 0 1 0 0
1 0 0 0 0
我想将两个文件写成: 行wise.csv:
1,2
1,4
2,4
4,3
5,1
列wise.csv:
5,1
1,2
4,3
1,4
2,4
我知道我可以按行或逐列运行循环并使用fprintf逐个元素保存,但是有更好的方法吗? 我处理的是非常大的矩阵,我想知道这样做的有效方法是什么?
答案 0 :(得分:2)
您将要使用find
执行此任务。然后将它们写入csv文件,您只需使用dlmwrite
。
对于列方式,您可以使用find
的两个输出,它们是每个1的行索引和列索引(按列主要顺序)。
data = [0 1 0 1 0
0 0 0 1 0
0 0 0 0 0
0 0 1 0 0
1 0 0 0 0];
[row, col] = find(data);
M = [row, col];
dlmwrite('column-wise.csv', M);
然后,要获得行方式结果,您可以使用sortrows
按行然后按列对列方式结果进行排序。
dlmwrite('row-wise.csv', sortrows(M))
替代方法是在数据转置上再次执行find
(强制行主要排序),但我认为sortrows
方法更快。
[col, row] = find(data.');
dlmwrite('row-wise.csv', [row, col])