我有一个巨大的稀疏矩阵(1,000 x 1,000,000),我无法在matlab上加载(没有足够的RAM)。
我希望可视化这个矩阵,以了解它的稀疏性和值的差异。
由于内存限制,我想按照以下步骤进行操作:
1-将矩阵划分为4个矩阵
2-在matlab上加载每个矩阵并将其可视化,以便颜色可以了解值(特别是零)
3-"坚持"我将得到的4张图片是为了对原始矩阵有一个全局的想法
(i)是否可以加载"矩阵的一部分"在matlab中?
(ii)对于可视化工具,我read about间谍(和daspect)。但是,此功能仅能够无差别地显示非零值的尺度。有没有办法添加颜色代码?
(iii)我怎样才能坚持"情节是为了制作一个?
答案 0 :(得分:4)
如果您的矩阵是稀疏的,那么当前存储它的方法(作为文本文件中的完整矩阵)似乎非常低效,并且肯定会非常难以将其加载到MATLAB中。但是,我怀疑只要它足够稀疏,它仍然可以作为稀疏矩阵引入MATLAB。
这样做的传统方法是立即加载所有内容,然后转换为稀疏表示。但是,在您的情况下,在文本文件中一次读取一行并在运行中转换为MATLAB稀疏矩阵是有意义的。
你可以通过估计矩阵的稀疏性来判断这是否可行,并使用它来查看整个事物是否可以作为稀疏矩阵加载到MATLAB的内存中。
尝试类似:(未经测试的代码!)
% initialise sparse matrix
sparse_matrix = sparse(num_rows, num_cols);
row_num = 1;
fid = fopen(filename);
% read each line of text file in turn
while ~feof(fid)
this_line = fscanf(fid, '%f');
% add row to sparse matrix (note transpose, which I think is required)
sparse_matrix(row_num, :) = this_line';
row_num = row_num + 1;
end
fclose(fid)
% visualise using spy
spy(sparse_matrix)
<强>可视化强>
关于可视化:通过类似imagesc
的工具可视化这样的稀疏矩阵是可能的,但我相信它可以在内部创建完整的矩阵 - 也许有人可以确认这是否真实。如果确实如此,则会导致记忆问题。
所有spy
真正在做的是在2D中绘制非零元素的位置。您可以非常轻松地编写自己的间谍功能,根据每个位置的值,可以使用不同颜色或大小的点。有关示例,请参阅this answer。
保存稀疏矩阵
如上所述,保存矩阵的方法非常低效 - 对于稀疏度为10%的矩阵,大约95%的文本文件将为零或空格。我不知道这些数据来自何处,但如果您对其创建有任何控制(例如,它来自您编写的另一个程序),那么仅保存格式中的非零元素会更有意义{ {1}}。
然后,您可以使用spconvert
直接导入稀疏矩阵。
答案 1 :(得分:1)
最简单的方法之一(如果你可以将完整的稀疏矩阵存储在RAM中)就是使用gnuplot来显示sparisty模式。
我能够使用gnuplot间谍大小为10-20GB的矩阵而没有问题。但请确保使用png或jpeg格式输出图像。请注意,您不需要非零条目的值只有整数(row,col)。并绘制他们&#34; plot&#34; row_col.dat&#34;使用1:2和积分&#34;。
选择行作为x轴,cols作为y轴,并开始绘制非零项。这很容易做到。这是我所知道的最具扩展性的解决方案。即使对于非常大的数据集(大约10GB的[row,cols]),Gnuplot工作速度也不错,但Matlab只是挂起(适当尊重)
答案 2 :(得分:0)
我使用imagesc()
来可视化数组。它将数组中的值缩放到0到1之间的值,然后将数组绘制为灰度位图图像(当然,您可以更改colormap
以便更容易查看细节)。