Quiero crear una matriz muy grande en la que escribo '0' y '1'. Estoy tratando de simular un proceso físico llamado adsorción aleatoria secuencial, donde las unidades de longitud 2, dímeros, se depositan en una red n-dimensional en una ubicación aleatoria, sin superposición entre sí. El proceso se detiene cuando ya no queda más espacio en el enrejado para depositar más dímeros (el enrejado está atascado).¿Cómo definir y trabajar con una matriz de bits en C?
Inicialmente empiezo con un enrejado de ceros, y los dímeros están representados por un par de '1's. A medida que se deposita cada dímero, el sitio a la izquierda del dímero se bloquea, debido al hecho de que los dímeros no se pueden superponer. Así que simulo este proceso depositando un triple de '1 en el enrejado. Necesito repetir toda la simulación una gran cantidad de veces y luego calcular el% de cobertura promedio.
Ya he hecho esto usando una matriz de caracteres para redes 1D y 2D. Por el momento estoy tratando de hacer que el código sea lo más eficiente posible, antes de trabajar en el problema 3D y generalizaciones más complicadas.
Esto es básicamente lo que el código se ve como en 1D, simplificado:
int main()
{
/* Define lattice */
array = (char*)malloc(N * sizeof(char));
total_c = 0;
/* Carry out RSA multiple times */
for (i = 0; i < 1000; i++)
rand_seq_ads();
/* Calculate average coverage efficiency at jamming */
printf("coverage efficiency = %lf", total_c/1000);
return 0;
}
void rand_seq_ads()
{
/* Initialise array, initial conditions */
memset(a, 0, N * sizeof(char));
available_sites = N;
count = 0;
/* While the lattice still has enough room... */
while(available_sites != 0)
{
/* Generate random site location */
x = rand();
/* Deposit dimer (if site is available) */
if(array[x] == 0)
{
array[x] = 1;
array[x+1] = 1;
count += 1;
available_sites += -2;
}
/* Mark site left of dimer as unavailable (if its empty) */
if(array[x-1] == 0)
{
array[x-1] = 1;
available_sites += -1;
}
}
/* Calculate coverage %, and add to total */
c = count/N
total_c += c;
}
Para el proyecto actual que estoy haciendo, se trata no sólo de los dímeros de trímeros, pero quadrimers, y todo tipo de formas y tamaños (para 2D y 3D).
Tenía la esperanza de poder trabajar con bits individuales en lugar de bytes, pero he estado leyendo y, por lo que puedo ver, solo se puede cambiar 1 byte a la vez, así que o bien necesito ¿Haces alguna indexación complicada o hay una manera más simple de hacerlo?
Gracias por sus respuestas
Nota por una vez que está trabajando en bits individuales: si la eficiencia es vital, probablemente y desea, cuando sea posible, aplicar tus operaciones en al menos un byte a la vez (es decir mira múltiples coordenadas al mismo tiempo), ya que hacerlo, si se hace bien, no cuesta nada extra. Probablemente no valga la pena hacer esto, excepto en las partes del cuello con cuello de botella. – Brian