2016-02-02 3 views
0

Моя цель - создать прямоугольную сетку и присвоить значение да/нет каждой точке. Я занимаюсь довольно большой сеткой, поэтому решил сохранить ее как разреженную матрицу. Мой подход рассматривает N x N сетку, только с отношением r точек, чтобы быть истинными (так что Nact = r*N^2 баллов):Эффективное создание логической разреженной матрицы

N = 200; 
r = 0.25; 
NAct = r*N^2; 
ss = spalloc(ceil(N),ceil(N),ceil(NAct)); 
for j = 1:N, for i = 1:N, ss(i,j) = rand < r; end; end; 
ssL = logical(ss); 

Однако это, кажется, не эффективен для больших N.

Я также попытался это:

N = 200; 
r = 0.25; 
NAct = r*N^2; 
iAct = randi(N,1,N); 
jAct = randi(N,1,N); 
sssL = sparse(iAct,jAct,true,ceil(N),ceil(N),ceil(NAct)); 
nnz(sssL) 

в качестве альтернативы, но у меня есть две проблемы: true точки N вместо NAct, и возникает ошибка, если две пары элементов iAct и jAct совпадают ,

+0

разреженной матрицы не имеют никаких преимуществ с точки зрения пространства, если по сравнению с в большинстве логические выражения случаев. С порогом '0,25' логический массив' 200x200' занимает 40000 байт по сравнению с 92139 байтами, занятыми разреженными. Только матрицы с очень небольшим количеством ненулевых записей занимают меньше места, чем логические. – brainkz

+0

Прочитайте [этот ответ] (http://stackoverflow.com/a/32444192/5211833) о эффективности памяти разреженных матриц, особенно в последнем абзаце. Gist состоит в том, что 'разреженный' полезен, если у вас есть 70% или более нулевых записей в вашей системе. – Adriaan

+0

Возможный дубликат [Как найти K случайных разных пикселей в изображении?] (Http://stackoverflow.com/questions/34403738/how-to-find-k-random-different-pixels-in-an-image) – beaker

ответ

0
N = 200; 
Grid(N,N) = false; %// preallocate grid 
Grid = sparse(Grid); %// add to make sparse 
r = 213; 
TruePoints = randi(N^2,r,1); %// get random indices of points to be true 
Grid(TruePoints) = true; 
Grid = logical(Grid); %// switch to logical 
+0

Если я не ошибаюсь, это дает полную матрицу. Я уже использую что-то вроде «Grid = rand (N) Theo

+0

@ Вы можете легко это исправить, см. Обновление. По-видимому, существуют «разреженные логические» матрицы. – Adriaan

+0

В Matlab существуют только двойные и логические разреженные матрицы. – Theo

2

Я наконец использовал sprand

N = 200; 
r = 0.25; 
NAct = r*N^2; 
ss = sprand(N,N,r); 
ssL = logical(ss); 
+0

Очень приятно! Это похоже на самый прямой метод. – beaker