2014-09-24 2 views
1

Я хочу построить разреженную матрицу в стиле imagesc (один цвет для каждого пикселя, а не символы a la scatter). Матрица состоит из blobs, которые распространяются ut на 10000x10000 квадратных. Я ожидаю, что около 100 blobs и каждый blob будут 50x100 пикселей. Эта матрица настолько велика, что становится очень медленной, чтобы увеличивать или уменьшать масштаб или перемещаться в ней для проверки данных. И я все еще хочу сохранить резолюцию. Есть ли способ построить разреженную матрицу, которая просто отображает капли и имеет «нулевой цвет» цветовой карты в качестве фона, который не занимает места в памяти?Участок разреженной матрицы в matlab

Допустит, мы имеем матрицу М, которая выглядит следующим образом:

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

Когда я сюжет как разреженная матрица

figure; 
imagesc(sparse(M)); 

Он имеет тот же размер, опуская разреженную команду. Это то, что я хочу обойти.

+1

Интересный вопрос! И, о вашем имени: работаете ли вы в звуковом проектировании? –

+1

@ LuisMendo - Это определенно ссылка на обработку звукового сигнала! – rayryeng

+0

Я люблю сочинять, играть и записывать музыку! Конечно, я также использую Matlab для этого :-) @rayryeng –

ответ

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

+0

Спасибо за ваш ответ! Я перестраиваю ваш код так, чтобы он выполнял фактическую команду imagesc для всех пикселей, которые вместо этого не равны нулю. Мне нужно, чтобы это был фиксированный квадрат для каждого пикселя, потому что я тоже рисую другие вещи поверх всех. Я петлю над imagesc для всех ненулевых элементов, но он занимает навсегда график, поэтому я попытаюсь изолировать капли и построить их по одному или что-то умнее. Я ожидаю, что около 100 blobs и каждый blob будут 50x100 пикселей. Я обновляю вопрос. – fixingstuff

+0

Если это существенное изменение, может быть, лучше поставить новый вопрос. –

Смежные вопросы