2014-09-24 147 views
1

我想在imagesc类型的样式中绘制一个稀疏矩阵(每个像素一种颜色,而不是一个颜色为scatter)。该矩阵由散布在10000x10000平方米上的斑点组成。我预计大约100个斑点,每个斑点为50x100像素。这个矩阵非常大,以至于放大或缩小或在其中移动以检查数据变得非常迟缓。我仍然想保持这个决议。有什么方法可以绘制一个稀疏矩阵,它只是绘制斑点并将色彩图的“零色”作为背景,而不会占用内存中的任何空间?在matlab中绘制稀疏矩阵

假设我们有一个矩阵M,看起来像这样:

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

当我绘制它作为一个稀疏矩阵

figure; 
imagesc(sparse(M)); 

它采用相同尺寸省略稀疏命令。这是我想要规避的。

+1

有趣的问题!而且,关于你的名字:你是否从事音响工程? – 2014-09-24 21:56:40

+1

@LuisMendo - 这绝对是一个音频信号处理参考! – rayryeng 2014-09-24 22:00:30

+0

我喜欢作曲,演奏和录制音乐!当然,我也倾向于使用Matlab的:-) @rayryeng – 2014-09-24 22:03:39

回答

4

而不是将矩阵当作图像处理,您只能绘制其非零值。使用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

enter image description here

+0

+1 - 酷!非常好。 – rayryeng 2014-09-24 22:00:46

+0

感谢您的回答!我重构你的代码,以便它为所有非零的像素执行实际的imagesc命令。我需要它是每个像素的固定正方形,因为我正在绘制其他东西。我遍历所有非零元素的imagesc,但它需要永远绘制,所以我会尝试隔离blob并逐一绘制它们或更聪明的东西。我预计大约100个斑点,每个斑点为50x100像素。我正在更新这个问题。 – fixingstuff 2014-09-24 22:21:45

+0

如果这是一个实质性的变化,它可能会更好发布一个新的问题 – 2014-09-24 22:29:23