Matlab - Matriz permutación

   
Vista:

Matriz permutación

Publicado por Aitor (46 intervenciones) el 17/04/2017 01:06:36
Buenas tardes chicos,

Tengo mis dudas sobre cómo avanzar con un trabajillo. Partiendo de una matriz B de dimensión MxN de unos y ceros, necesitaría sustituirla por otra H donde en lugar de cada uno haya una matriz permutación (cuadrada) de dimensión D (D puede ser un número arbitrariamente grande, y así lo será en condiciones normales). Cada 0 en B es sustituido en H por una matriz nula de dimensión D.

¿Sabéis cómo podría proceder?

Os adjunto el código con el que he generado mi matriz B para que la tengáis como punto de partida:

1
2
3
4
5
6
7
8
9
B = zeros((L + ms) * dc, L * dv);
 
    for i = 1 : 1 : L
        for j = 1 : 1 : dv
 
            B(dc*(i-1)+1 : dc*(ms+i), j+dv*(i-1)) = ones(dc*(ms+1), 1);
 
        end
    end

Os doy las gracias a todos de antemano, y os envio un saludo.
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 JESUS DAVID ARIZA ROYETH

Matriz permutación

te recomiendo el uso de cells , tienes un array de cells conteniendo las matrices y con esto puedes convertir este array a una matriz de mayor dimensión
1
2
3
4
5
6
B=randi([0,1],5,5); %matriz de B aleatoria
H=repmat({{}},5,5); %inicio cell H
MP=randi([1,5],D,D); %matriz permutacion cuadrada aleatoria
D=4; %dimension cualquiera
[H{B==0}]=deal(zeros(D)); %asigno nulos
[H{B==1}]=deal(MP); %asigno cuadrada
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

Matriz permutación

Publicado por Aitor (46 intervenciones) el 17/04/2017 12:00:36
Hola Jesús,

Muchas gracias como siempre por echarme una mano.

El problema es que no sé muy bien cómo se manejan los objetos de tipo 'cell'... y necesitaría seguir trabajando con esa matriz a continuación, con lo que me resultaría muy conveniente que estuviera como forma matricial. Dicho lo cual, sería bastante grande, así que no sé hasta qué punto sería plausible. ¿Habría alguna otra posibilidad?
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

Matriz permutación

Publicado por Aitor (46 intervenciones) el 17/04/2017 12:44:39
Además sería deseable que el reemplazo de cada elemento no nulo de B fuera cada vez por una matriz distinta... ¿se podría hacer ésto de alguna forma ágil, a poder ser sin bucles para que no tardase mucho en ejecutar? (ya las dimensiones de la matriz permutación serían bastante grandes, de quizá 500x500 o 600x600 elementos)

Un saludo!
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
Imágen de perfil de JESUS DAVID ARIZA ROYETH

Matriz permutación

es recomendable el uso de cell primero porque te vas a evitar muchos ciclos y esto acelera la velocidad de tu programa, y una desventaja que tiene el uso de cell es el espacio de memoria que ocupan si tienes una matriz de celdas y está vacía ya pesa 60 bytes cada elemento de esa matriz (estando vacío) , pero esta desventaja la vas a resolver una vez terminado tu procedimiento convirtiendo a una matriz normal, con el comando reshape
te dejo un ejemplo :

1
2
3
a={[1 2] [3 4];[5 6] [7 8]};
b=a';
nuevaa=reshape([b{:}],[],size(a,1))';


con respecto a que sea los elementos no nulos sean reemplazados por una matriz distinta claro que se puede
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

Matriz permutación

Publicado por Aitor (46 intervenciones) el 18/04/2017 13:13:58
De todas formas, si quisiera que se tratase de una matriz permutación de sólo ceros y unos ese comando no funcionaría ¿me equivoco? Fíjate por ejemplo en el siguiente caso:

1
A=randi([0,1],10,10)

Para que funcionase, debería haber un solo 1 en cada fila y en cada columna de A, y no parece ser el caso...

Por otro lado, cuando ejecuto el siguiente fragmento de código

1
2
3
4
5
6
H=repmat({{}},size(B));
     [H{B==0}]=deal(zeros(M));
     [H{B==1}]=deal(randi([0,1],M,M));
 
     H = H';
     H =reshape([H{:}],[],size(H,1))';

El resultado no me devuelve una matriz H escalada M veces tanto en filas como en columnas, sino sólo en filas. ¿A qué crees que se podría deber?

Aquí tienes lo que sería el código completo:

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
L = 15;
dc = 3;
dv = 4;
ms = 2;
M = 600;
 
% function H = parityCheck(L, dc, dv, ms, M)
%parityCheck
%Creation of a parity check matrix from the parameters defined in 
%SC_params script
 
%% Creation of base matrix B
 
    B = zeros((L + ms) * dc, L * dv);
 
    for i = 1 : 1 : L
        for j = 1 : 1 : dv
 
            B(dc*(i-1)+1 : dc*(ms+i), j+dv*(i-1)) = ones(dc*(ms+1), 1);
 
        end
    end
 
%% Creation of H through application of lifting factor
 
     H=repmat({{}},size(B));
     [H{B==0}]=deal(zeros(M));
     [H{B==1}]=deal(randi([0,1],M,M));
 
     H = H';
     H =reshape([H{:}],[],size(H,1))';

¡Gracias por todo Jesús y un saludo!
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
Imágen de perfil de JESUS DAVID ARIZA ROYETH

Matriz permutación

No ingeniero, para este caso usted no necesita algo tan al azar sino un azar más controlado

1
2
3
n=10;
A=zeros(n);
A(sub2ind(size(A),1:n,randperm(n)))=1;

este sí le genera lo que usted desea
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar

Matriz permutación

Publicado por Aitor (46 intervenciones) el 22/04/2017 00:38:13
¡Hola Jesús!

¡Muchas gracias! Ya está solucionado, gracias a mezclar la solución que me propusiste con la que me propusieron aquí:

http://stackoverflow.com/questions/43450131/replacing-elements-in-a-base-matrix-by-squared-permutation-submatrices

¡Un saludo!
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