在matlab中可视化大矩阵

时间:2014-02-13 11:00:49

标签: matlab matrix visualization sparse-matrix

我有一个巨大的稀疏矩阵(1,000 x 1,000,000),我无法在matlab上加载(没有足够的RAM)。

我希望可视化这个矩阵,以了解它的稀疏性和值的差异。

由于内存限制,我想按照以下步骤进行操作:

1-将矩阵划分为4个矩阵

2-在matlab上加载每个矩阵并将其可视化,以便颜色可以了解值(特别是零)

3-"坚持"我将得到的4张图片是为了对原始矩阵有一个全局的想法

(i)是否可以加载"矩阵的一部分"在matlab中?

(ii)对于可视化工具,我read about间谍(和daspect)。但是,此功能仅能够无差别地显示非零值的尺度。有没有办法添加颜色代码?

(iii)我怎样才能坚持"情节是为了制作一个?

3 个答案:

答案 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以便更容易查看细节)。