Моя цель - создать прямоугольную сетку и присвоить значение да/нет каждой точке. Я занимаюсь довольно большой сеткой, поэтому решил сохранить ее как разреженную матрицу. Мой подход рассматривает 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,25' логический массив' 200x200' занимает 40000 байт по сравнению с 92139 байтами, занятыми разреженными. Только матрицы с очень небольшим количеством ненулевых записей занимают меньше места, чем логические. – brainkz
Прочитайте [этот ответ] (http://stackoverflow.com/a/32444192/5211833) о эффективности памяти разреженных матриц, особенно в последнем абзаце. Gist состоит в том, что 'разреженный' полезен, если у вас есть 70% или более нулевых записей в вашей системе. – Adriaan
Возможный дубликат [Как найти K случайных разных пикселей в изображении?] (Http://stackoverflow.com/questions/34403738/how-to-find-k-random-different-pixels-in-an-image) – beaker