【问题标题】:Visualizing a large matrix in matlab在matlab中可视化一个大矩阵
【发布时间】:2014-02-13 11:00:49
【问题描述】:

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

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

由于内存限制,我想进行如下操作:

1-将矩阵分成4个矩阵

2- 在 matlab 上加载每个矩阵并将其可视化,以便颜色给出值的概念(尤其是零)

3-“粘贴”我将获得的 4 张图像,以便对原始矩阵有一个全局概念

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

(ii) 对于可视化工具,我read about spy(和 daspect)。但是,此功能只能以无关紧要的方式可视化非零值的比例。有没有办法添加颜色代码?

(iii) 我怎样才能“坚持”地块来制作?

【问题讨论】:

  • 矩阵目前是如何存储的?
  • @nkjt 在文本文件中(以空格分隔的列)

标签: matlab matrix visualization sparse-matrix


【解决方案1】:

如果您的矩阵是稀疏的,那么当前存储它的方法(作为文本文件中的完整矩阵)似乎非常低效,并且肯定会使将其加载到 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 真正做的是在二维中绘制非零元素的位置。您可以相当轻松地编写自己的 spy 函数,根据每个位置的值,它可以具有不同颜色或大小的点。有关示例,请参阅this answer


保存稀疏矩阵

正如我上面所说,保存矩阵的方法效率很低——对于稀疏度为 10% 的矩阵,大约 95% 的文本文件将是零或空格。我不知道这些数据是从哪里来的,但是如果您对其创建有任何控制权(例如,它来自您编写的另一个程序),那么仅以 @ 格式保存非零元素会更有意义987654328@。

然后您可以使用spconvert 直接导入稀疏矩阵。

【讨论】:

  • 实际上,我不知道我的矩阵有多稀疏(这就是我想可视化它的原因)。但是如果有很多零,那么我可能会按照你的建议做谢谢
  • 您可以随时修改代码以仅保存每 100 个值或每 100 行 - 这将使您无需全部加载即可了解稀疏性。
  • 不幸的是,它不起作用。我认为 fopen 阻塞了一切(因为内存问题)并且代码没有进入循环......
  • 嗯,文件有多大?如果它大于 2^31-1 字节,您可能会遇到此问题:mathworks.gr/matlabcentral/answers/…
  • 如果你在 linux/unix 上,你可以尝试split 在读入之前将你的文件分成更小的块:stackoverflow.com/questions/2016894/…
【解决方案2】:

最简单的方法之一(如果您实际上可以将完整的稀疏矩阵存储在 RAM 中)是使用 gnuplot 来可视化稀疏模式。

我能够毫无问题地使用 gnuplot 监视大小为 10-20GB 的矩阵。但请确保使用 png 或 jpeg 格式输出图像。请注意,您不需要非零条目的值,只需要整数(行,列)。并绘制它们“使用 1:2 与点绘制“row_col.dat”。

这会将您的行选择为 x 轴,将 cols 选择为您的 y 轴并开始绘制非零条目。这很容易做到。这是我所知道的最具可扩展性的解决方案。即使对于非常大的数据集(>10GB of [row, cols]),Gnuplot 也能以不错的速度运行,但 Matlab 只是挂起(尊重)

【讨论】:

    【解决方案3】:

    我使用imagesc() 来可视化数组。它将数组中的值缩放到 0 到 1 之间的值,然后像灰度位图图像一样绘制数组(当然您可以更改 colormap 以更容易查看细节)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-12
      • 1970-01-01
      • 2011-10-25
      • 2016-10-04
      • 2011-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多