2014-09-24 202 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