Problema para crear una matriz
Publicado por Aitor (49 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:
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.
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


0