Matlab - Problema para crear una matriz

   
Vista:

Problema para crear una matriz

Publicado por Aitor (46 intervenciones) el 03/03/2017 23:31:53
Hola,

A ver cómo me las apaño para explicarme...

Tras usar fmincon, he obtenido como resultado unos vectores v de 1xN elementos y h de 1xN*r elementos, respectivamente. La suma de sus elementos ha de ser igual a 1, y el primero ser igual a 0 para ambos casos, v y h.
Esto es, tenemos v_1 = h_1 = 0; 0 =< v_i <= 1 para i = 2, ..., N y 0<= h_i <= 1 para i = 2, ..., N*r. r es a su vez un número entre 0 y 1.

A continuación necesito aplicar la siguiente función:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
% MacKayNeal Function                                                     %
%                                                                         %
% Inputs                                                                  %
% N: length of the codeword (Number of columns of parity-check matrix H)  %
% r: rate of the LDPC code                                                %
% v: distribution of edges                                                %
% h: distribution of nodes                                                %
%                                                                         %
% Outputs                                                                 %
% H: parity-check matrix                                                  %
%                                                                         %
% Author: Aitor López Hernández                                           %
%                                                                         %
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
 
function H = MacKayNeal(N,r,v,h)
 
H = zeros(N*(1-r),N); % Creation of an idle parity-check matrix
 
a = []; % Number of 1s per column of H
for i=1:length(v)
    for j=1:(v(i)*N)
        a = [a,i];
    end
end
 
b = []; % Number of 1s per row of H
for i=1:length(h)
    for j=1:(h(i)*(N*(1-r)))
        b = [b,i];
    end
end
 
b_i = 1:length(b); % Indexes of rows of H that still have 1s to append
 
for i=1:N
    for j=1:1:length(b)
    if b(j) == 0
        b_i = setdiff(b_i,b(j));
    end
    end
    c = datasample(b_i,a(i),'Replace',false);
    c_i = zeros(1,length(b));
    for j=1:a(i)
        H(c(j),i)=1;
        c_i(1,c(j))=1;
    end
    b = b - c_i;
end
 
% Removal of length-4 cycles
 
for i=1:N*(1-r)-1
    for j=i+1:N*(1-r)
       w = and(H(i,:),H(j,:));
       c1 = find(w);
       lc = length(c1);
       if lc > 1
           % If found, flip one 1 to 0 in the row with less number of 1s
           if length(find(H(i,:))) < length(find(H(j,:)))
           % Repeat the process until only one column left
           for cc = 1:(lc-1)
               H(j,c1(cc)) = 0;
           end
           else
           for cc = 1:(lc-1)
               H(i,c1(cc)) = 0;
           end
           end
       end
    end
end
end

Cuya salida es una matriz H formada por unos y ceros. Para más información, sólo comentar que v y h obedecen, respectivamente, a la distribución de los unos por filas y por columnas en la matriz H.

En mi caso, estoy trabajando con un valor relativamente grande de N (por ejemplo N = 100, aunque sería deseable que funcionase incluso para N = 1000 o N = 2000) y con un valor para r de 0.5, o de 0.6 (por poner un ejemplo). Sin embargo mi código no funciona.

El motivo es que una vez aplico la función fmincon, recibo resultados bastante desiguales para los elementos de v. Debido a esto, recibo un valor para v_2 igual a 0.9808287 (por ejemplo; cualquier valor muy cercano a 1 podría valerme) y el resto de los elementos se reparten el sustraendo restante.

No sé si me he explicado bien en el párrafo superior, conque si tenéis alguna duda al respecto o sobre cualquier otro tema, no tendréis más que preguntarme. Os estaré leyendo por aquí.

Un saludo, y muchas gracias de antemano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de JOSE JEREMIAS CABALLERO

Problema para crear una matriz

Publicado por JOSE JEREMIAS CABALLERO jjcc94@hotmail.com (4092 intervenciones) el 04/03/2017 13:35:06
Este parte del codigo
1
2
3
4
5
6
7
8
9
for j=1:length(b)
    if b(j) == 0
       ceros=b(j)
        b_i = setdiff(b_i,b(j));
 
    end
    end
    c = datasample(b_i,a(i),'Replace',false);
    c_i = zeros(1,length(b))
;

siempre va a tomar el último b_j, pero en las iteraciones que observado el vector b tiene varios ceros es una misma iteración.
¿Entonces la pregunta es, si solo toma el último b(j) que es cero, que pasa con los demás b(j) que son ceros también?.
Aquí un ejemplo:
cuando i toma el valor 36 no hay problema porque porque en el vector b solo hay un cero , pero cuando i toma el valor de 67 el vector b tiene varios ceros


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
i =
    36
b =
  Columns 1 through 27
     1     1    -3     1     1     3     4     3     4     5     5     4     4     5     4     5     0     5     3     5     3     4     6     4     4     1     6
  Columns 28 through 50
     5     2     4     5     2     3     1     5     4     5     5     5     4     7     2     7     3     5     5     5     3     6     6
ceros =
     0
 
 
i =
    67
b =
  Columns 1 through 27
    -4    -3    -7    -2    -4     0     0    -1     3     4    -4    -5     0    -1     0    -2    -4     3    -2     1    -1     0     5     1    -2    -5     2
  Columns 28 through 50
     2    -6    -1     1    -4    -2    -2     0     3     1    -1     0     0     4    -2     5     2    -3    -1     3    -1     3     3
ceros =
     0
ceros =
     0
ceros =
     0
ceros =
     0
ceros =
     0
ceros =
     0
ceros =
     0
ceros =
     0
i =
    68
b =
  Columns 1 through 27
    -5    -3    -7    -3    -4     0     0    -1     3     4    -4    -5     0    -1     0    -2    -4     3    -2     1    -1     0     5     1    -2    -5     2
  Columns 28 through 50
     2    -7    -1     0    -4    -2    -2     0     3     1    -1     0     0     4    -3     4     2    -3    -1     2    -1     3     2
ceros =
     0
ceros =
     0
ceros =
     0
ceros =
     0
ceros =
     0
ceros =
     0
ceros =
     0
ceros =
     0
ceros =
     0
i =
    69
b =
  Columns 1 through 27
    -5    -3    -7    -3    -4     0     0    -2     3     4    -4    -5     0    -1     0    -3    -4     3    -2     1    -1    -1     4     1    -3    -6     2
  Columns 28 through 50
     1    -7    -1     0    -4    -2    -2     0     3     1    -1     0    -1     4    -3     4     2    -3    -1     2    -1     3     2
ceros =
     0
ceros =
     0
ceros =
     0
ceros =
     0
ceros =
     0
ceros =
     0
ceros =
     0
i =
    70


Aca una parte del código optimizado es decir vectorizado para evitar el uso de for y de esa manera optimizar el tiempo de ejecución del código.

1
2
3
4
5
6
7
8
9
10
a = [];
for i=1:length(v)
       a = [a,i*ones(1,v(i)*N)];
    end
a;
 b = [];
for i=1:length(h)
        b = [b,i*ones(1,h(i)*N*(1-r))];
end
b;

En líneas posteriores también veo que se puede optimizar, de esa manera evitar un ciclo for que demora el tiempo de ejecución del código, pero no tengo claro exactamente qué es lo desea hacer.

He observado todo el código y he tratado de entender lo que está ha programado y tuve estes observaciones y algunos más.

Saludos
JOSE JEREMIAS CABALLERO
Asesor de Proyectos con Matlab
Servicios de programación matlab


http://matlabcaballero.blogspot.com
https://www.facebook.com/matlabcaballero/
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar