Matlab - Método de eliminación de Gauss-Jordan en matrices binarias

 
Vista:
sin imagen de perfil
Val: 68
Ha aumentado 1 puesto en Matlab (en relación al último mes)
Gráfica de Matlab

Método de eliminación de Gauss-Jordan en matrices binarias

Publicado por Aitor (49 intervenciones) el 10/06/2017 10:21:53
¡Buenos días!

Necesito transformar una matriz de paridad binaria H (esto es, que sólo contiene unos y ceros) en otra patriz de paridad binaria sistemática Hsys de la siguiente forma:
Hsys = [A | I]

Donde H y Hsys tienen la misma dimensión (n-k,n) e I es una matriz identidad de dimensión n-k.

Mi problema es que tras ejecutar el código que podéis encontrar debajo no consigo generar una matriz identidad de dimensión n-k. Os he adjuntado tres matrices con las que he trabajado a modo de ejemplo. Necesitaría que este código funcionase con matrices de cualquier dimensión (en la práctica necesito trabajar con dimensiones del orden de 51000 x 64000).

Aquí podéis encontrar la función que he encontrado en github. Es una versión modificada de la función 'rref' de Matlab adaptada para trabajar con matrices en GF(2). Si hubiera alguna forma más sencilla de hacer esto, ¡estaré encantado de conocerla!

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
% This is a modified version of matlab's building rref which calculates
% row-reduced echelon form in gf(2).  Useful for linear codes.
% Tolerance was removed because yolo, and because all values
% should only be 0 or 1.  @benathon

function [A] = g2rref(A)
%G2RREF   Reduced row echelon form in gf(2).
%   R = RREF(A) produces the reduced row echelon form of A in gf(2).
%
%   Class support for input A:
%      float: with values 0 or 1
%   Copyright 1984-2005 The MathWorks, Inc. 
%   $Revision: 5.9.4.3 $  $Date: 2006/01/18 21:58:54 $

[m,n] = size(A);

% Loop over the entire matrix.
i = 1;
j = 1;


while (i <= m) && (j <= n)
   % Find value and index of largest element in the remainder of column j.
   k = find(A(i:m,j),1) + i - 1;

   % Swap i-th and k-th rows.
   A([i k],j:n) = A([k i],j:n);
   
   % Save the right hand side of the pivot row
   aijn = A(i,j:n);
   
   % Column we're looking at
   col = A(1:m,j);
 
   % Never Xor the pivot row against itself
   col(i) = 0;
 
   % This builds an matrix of bits to flip
   flip = col*aijn;
 
   % Xor the right hand side of the pivot row with all the other rows
   A(1:m,j:n) = xor( A(1:m,j:n), flip );
 
   i = i + 1;
   j = j + 1;
end

Y aquí os pongo algunas de las matrices con las que he probado este código:

1
2
3
4
5
6
H=[1 1 0 1 1 0 0 1 0 0;
   0 1 1 0 1 1 1 0 0 0;
   0 0 0 1 0 0 0 1 1 1;
   1 1 0 0 0 1 1 0 1 0;
   0 0 1 0 0 1 0 1 0 1]; % Funciona
H=[1 0 1 1 0; 0 0 1 0 1; 1 0 0 1 0; 1 0 1 1 1]; % No funciona

(La tercera matriz, de dimensión 50x100, podéis generarla con los archivos que os adjunto en el mensaje).

Un saludo a todos y muchas gracias de antemano por vuestra ayuda. ¡Que tengáis un buen fin de semana!
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

Método de eliminación de Gauss-Jordan en matrices binarias

Publicado por Caracola20 (1 intervención) el 16/02/2022 10:56:31
Aitor tengo el mismo problema. Necesito escribir en forma standard ([A | I]) la matriz de paridad. He probado el código con tus matrices y con las mías. Te resumo mis conclusiones en lo siguiente:

Para poder escribir la matriz de paridad de un código lineal (teoría de códigos lineales) de la forma que tu quieres necesitas una matriz de partida con rango n-k. De lo contrario no obtendrás la identidad de dimensión n-k al hacer la eliminación de Gauss por filas.

La primera de las matrices que pones es de rango 5 y el código funciona (n-k=5 ).
La segunda es de n-k=1 (=filas - columnas) = rango, por lo que te sale la identidad de dimensión 1x1.
Para la tercera ocurre lo siguiente: la matriz es de dimensión 50x100 luego n-k=50 pero al aplicar el código no obtienes la matriz identidad de orden 50 ya que el rango de esta matriz es 42. Que la matriz tenga rango 42 significa que tienes 42 filas o 42 columnas linealmente independientes y NO más. Al aplicar el método de Gauss-Jordan por filas a una matriz cualquiera obtienes una matriz equivalente, por lo que el rango de la matriz de partida es el mismo que el rango de la matriz una vez trasformada. No puedes obtener la identidad de orden 50 ( 50 filas linealmente independientes) porque H solo tiene 42 filas independientes.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar