【问题标题】:Sparse matrix plot matlab稀疏矩阵图matlab
【发布时间】:2013-04-11 03:58:16
【问题描述】:

我有一个 5000 *5000 的稀疏矩阵,有 4 个不同的值。我想用 4 种不同颜色可视化非零元素,以便我可以识别这些值的比率以及它们之间的关系,我使用 imagesc 但我不能很好地识别不同的值,尤其是具有较小比率的值。我认为如果我为每个值使用一些符号,它可以工作,但我不知道它在 Matlab 中是如何的。有什么建议吗? Dan代码的结果如下图。

【问题讨论】:

  • 您是否尝试过更改颜色图?使用 jet 默认值以外的其他值可能有助于增加对比度。
  • @BjoernH 谢谢,是的,我尝试了不同的方法,但对比度不好,因为矩阵非常稀疏,而且看起来像一个非常小的点。我想我必须使用一些符号,如圆形或三角形或符号,如 + ...但我不知道如何在 Matlab 中使用它们。
  • 试试我的答案,它使用星号,但如果你想要圆圈,然后尝试'o' 而不是'*' 加上你可以摆弄情节的linewidth 属性,如果你想让它们更厚,并使用轴([0, 5000, 0, 5000]) 正确缩放它
  • 如果这是结果,那么它对我来说看起来不是很稀疏。你确定它只是你不想显示的非零元素,也许这些元素只是非常小的值,你应该将我的代码中的 == 0 替换为类似`

标签: image matlab image-processing matrix plot


【解决方案1】:

您可以将矩阵改造成一组 [X, Y, F] 坐标(重复使用我在 Resampling Matrix and restoring in one single Matrix 中的回答):

假设你的矩阵是M

[X, Y] = meshgrid(1:size(M,1), 1:size(M,2));
Mf = M(:); %used again later, hence stored
V = [X(:), Y(:), Mf];

摆脱零元素

V(Mf == 0, :) = [];

此时,如果您可以访问统计工具箱,则只需转到 gscatter(V(:,1), V(:,2), V(:,3)) 即可获得正确的绘图,否则如果您没有工具箱,请继续以下操作:

查找 M 中唯一值的列表

Vu = unique(V(:,3));

对于每个这样的值,将点绘制为 xy 散点图,注意保持所有确保每次添加新图时颜色都会发生变化,即循环的每次新迭代

hold all;
for g = 1:length(Vu)
    Vg = V(V(:,3)==Vu(g),:)
    plot(Vg(:,1), Vg(:,2), '*');
    a{g}=num2str(Vu(g));
end
legend(a);

例如M:

M = zeros(1000);
M(200,30) = 7;
M(100, 900) = 10;
M(150, 901) = 13;
M(600, 600) = 13;

结果:

【讨论】:

  • 感谢回答,结果如上图,点的位置相互重叠。
  • 元素数:零个数=26516373,0,33个数=8728,0.66个数=21415,个数个数=17200。知道吗?我想显示非零元素。
  • 好吧,您实际上是在制作 5k * 5k 的图像,这是一个 25 兆像素的图像,非常巨大!我认为你只需要放大很多。或者将其显示在一个巨大的屏幕上......并且仍然放大。我会使用'.' 而不是'*' 并且可能会分段检查此图像,例如一次一个象限或其他什么?或者,如果数据的性质允许,则进行下采样。
  • 是的,结果表明你是对的。再次感谢。我怎样才能表示这样的矩阵信息?
  • 您需要创建一个图形图例并在每次迭代时添加到它(即图形图例标签在每次迭代时为Vu(g)。如果您阅读这篇文章并试一试卡住然后发布一个关于人物传说的新问题:mathworks.com/help/matlab/creating_plots/…
【解决方案2】:

现在我可以回答问题的第一部分了。我想你需要做类似的事情

sum(histc(A, unique(A)),2)

计算矩阵中唯一值的数量。

temp = histc(A, unique(A))“是一个列直方图计数矩阵。”因此,您将获得出现在 A 列中的所有 unique(A) 值的计数。

我正在使用stat = sum(temp,2) 来获取整个矩阵中unique(A) 的所有值的计数。

然后您可以使用@Dan 提出的代码来可视化结果。

hold all; 
u=unique(A);
for i = 1:length(stat) 
plot(u(i), stat(i)/max(stat), '*');
end

请澄清你的意思是什么价值观之间的关系?

【讨论】:

  • @谢谢,但测试一下。这是不正确的“情节(u(i),stat(i)/max(stat),'*')”。顺便说一句,丹的答案是正确的。问题是矩阵的大小。
  • 亲爱的法蒂玛!如果你需要计算 y 轴上的值,你应该只是 plot(u(i), stat(i), '*'); 我刚刚标准化了在最大计数上潜水的值 max(stat)
猜你喜欢
  • 1970-01-01
  • 2017-07-02
  • 2012-06-20
  • 2014-05-12
  • 1970-01-01
  • 2022-08-18
  • 2012-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多