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

 
Vista:
sin imagen de perfil
Val: 64
Ha mantenido su posición 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