【问题标题】:Plot sparse matrix in matlab在matlab中绘制稀疏矩阵
【发布时间】:2014-09-25 06:26:58
【问题描述】:

我想以imagesc 类型的样式绘制稀疏矩阵(每个像素一种颜色,而不是scatter 的符号)。该矩阵由散布在 10000x10000 正方形上的斑点组成。我预计大约有 100 个 blob,每个 blob 为 50x100 像素。这个矩阵太大了,放大或缩小或在其中移动以检查数据变得非常滞后。我仍然想保留决议。有什么方法可以绘制一个稀疏矩阵,它只绘制斑点,并将颜色图的“零颜色”作为背景,不占用内存?

假设我们有一个如下所示的矩阵 M:

[1, 2,  1, 0;
 0, 1, .4, 0;
 0, 0,  0, 0;
 0, 7,  0, 0]

当我将其绘制为稀疏矩阵时

figure; 
imagesc(sparse(M));

它的大小与省略 sparse-command 的大小相同。这就是我想要规避的。

【问题讨论】:

  • 有趣的问题!还有,关于你的名字:你从事音响工程吗?
  • @LuisMendo - 这绝对是音频信号处理参考!
  • 我喜欢作曲、演奏和录制音乐!当然,我也倾向于使用 Matlab :-) @rayryeng​​span>
  • 是的,它是一个完善的工程参考 :)

标签: image matlab plot sparse-matrix


【解决方案1】:

您可以仅绘制其非零值,而不是将矩阵视为图像。使用scatter(而不是plot)允许您将颜色作为值的函数,如imagesc

默认情况下scatter 将背景保留为白色,因此您必须对其进行调整。这分两步完成:确保scatter 的颜色缩放将颜色图的第一种颜色分配为值 0;然后手动将轴的背景设置为该颜色。

不过,我还没有测试这是否占用更少的内存。

%// Generate example matrix
M = 10000*rand(1000);
M(M>100) = 0;
M = sparse(M); %// example 1000x1000 matrix with ~1% sparsity

%// Do the plot
cmap = jet; %// choose a colormap
s = .5; %// dot size
colormap(cmap); %// use it
[ii, jj, Mnnz] = find(M); %// get nonzero values and its positions
scatter(1,1,s,0) %// make sure the first color corresponds to 0 value.
hold on
scatter(ii,jj,s,Mnnz); %// do the actual plot of the nonzero values
set(gca,'color',cmap(1,:)) %// set axis backgroud to first color
colorbar %// show colorbar

注意轴的方向可能与imagesc不同。

【讨论】:

  • 感谢您的回答!我正在重组您的代码,以便它对所有非零像素执行实际的 imagesc 命令。我需要它是每个像素的固定正方形,因为我还在所有东西的顶部绘制其他东西。我遍历所有非零元素的图像,但绘制需要很长时间,所以我将尝试隔离斑点并一个一个地绘制它们或更智能的东西。我预计大约有 100 个 blob,每个 blob 为 50x100 像素。我正在更新问题。
  • 如果是重大变化,最好发布一个新问题
  • 只是我需要将它绘制成 imagesc 类型的样式(每个像素一种颜色),而不是散点图。
  • 但结果在视觉上是一样的。 scatter 中的那些符号非常小,以至于无法与像素区分开来
  • 顺便说一句 - 您可以使用 SPRAND 直接以稀疏形式生成示例矩阵...
猜你喜欢
  • 2013-04-11
  • 1970-01-01
  • 2017-07-02
  • 2012-06-20
  • 2019-10-31
  • 2013-03-02
  • 2017-07-01
  • 2020-10-29
  • 2014-05-12
相关资源
最近更新 更多