Matlab - Subscripted assignment dimension mismatch

   
Vista:

Subscripted assignment dimension mismatch

Publicado por Ernesto Flores (1 intervención) el 12/12/2013 06:22:29
Tengo una matriz binaria de N x M, que representa la actividad celular (1 célula activa, 0 célula no activa), abajo muestro un ejemplo del raster, necesito obtener la frecuencia entre espigas y colocar la frecuencia a partir de la segunda espiga, y armar una nueva matriz con la frecuencia, el programa corre si le pido células individuales, si le pido la célula 1 y 2 o 3 y 4 pero no cuando pido las 4 células o la 2 y 3, el mensaje de error q sale es

??? Subscripted assignment dimension mismatch.

Alguien tiene idea como puedo resolver el problema

raster = [0 1 0 0 1 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 1 0 0 0
1 0 0 0 0 1 0 0 1 0 0 1 1 0 1 0 0 1 0 1 0 1 0 0 1
0 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 1 0 1 0 0 1];

[c, f] = size (raster);
F3 = [ ];
F4 = [ ];
F5 = zeros (c,f);

for a = 1:c
V = raster(a,:);
FV = find(V);
[c1, f1] = size(FV);
for b = 1:f1-1
cont = b;
cont1 = 1+b;
F2 = ((FV(cont1))-(FV(cont)));
F3(b) = 1/F2

end

F5(a,FV(1,2:end)) = F3
end
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

Subscripted assignment dimension mismatch

Publicado por JOSE JEREMIAS CABALLERO jjcc94@hotmail.com (3440 intervenciones) el 12/12/2013 14:23:52
Te puedes pasar horas y horas buscando el error y no encontrarlo, es secreto que es vayas probando línea por línea, desde 1 luego 2, luego 3, etc pero todo las sentencia deben de estar sin comas, para que veas como se están comportando y vas a ver claramente que el vector F3 funciona muy bien cuando la cantidad de unos es mayor que la anterior fila de la matriz raster, pero si la cantidad de unos es menor que cantidad que unos de la fila anterior, allí va a haber problemas, pues la longitud del vector F3 se va modificando en cada iteración y si hay mas unos aumenta su longitud, pero si hay menos unos no disminuye su longitud (este es el problema). Son errores que no puedes detectar, si no tienes base en el tema de vectores, por eso justamente es que el curso de matlab básico siempre se empieza con vectores. Y todo usuario de matlab debería aprender como curso de introducción de Matlab, el tema de vectores. Ahora el detalle como solucionas ese problema, que se presenta, hay dos formas de hacerlo y aquí te presento uno de ellos, la forma mas rápida es borrar en cada iteración la variable F3, y eso se hace con la función clear, claro este función se enseña en una primera clase matlab. El comando clear juega un papel importante en el mundo de programación de Matlab, además de eso hay otra función que es la función whos, este función es muy importante al momento de hacer un programa y con esta función tu puedes ir detectando como van variando o como son las dimensiones de tus variables que estas usando.

Tu código está filtrado, al generar variables no necesarias haces que cargue mas informacion a la memoria de matlab y eso ocasiona que al momento de ejecutarse sea mas lento, pero dirás yo no veo la diferencia, pero si trabajarías con imágenes o sonidos allí si verías la diferencia de generar variables innecesarias, y ahora como te das cuenta de eso, te vas a dar cuenta usando la función tic toc,.... puedo seguir escribiendo y escribiendo mas puntos que debe tener una persona que programe en matlab .... pero creo ya no viene al caso en tu pregunta.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
clear all
raster = [0 1 0 0 1 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 1 0 0 0
 1 0 0 0 0 1 0 0 1 0 0 1 1 0 1 0 0 1 0 1 0 1 0 0 1
 0 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0
 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 1 0 1 0 0 1]
 
 [c,f] = size (raster);
 F5=zeros(c,f);
 for a=1:c
     V=raster(a,:);  % guarda en el vector V la fila a de la matriz raster
     FV=find(V);  % halla en la filas 1 hasta 2 la posicion de  elemetnos no nulos
     f1=length(FV);  %guarda en f1 la longitud del vector FV 
     for b=1:f1-1
         F2=FV(1+b)-FV(b);   % Resta dos elementos consecutivos
         F3(b) = 1/F2;   % crea un vector con los inversos de cada F2
     end
      F5(a,FV(2:end))=F3;   % guarda el vector F3 en las posiciones unos de la matriz raster en el matriz F5
      clear F3 % borra el vector F3, ya que el tamaño de F3 depende de fila de la matriz raster
 end
 F5



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
>> actividad_celular
 
raster =
 
     0     1     0     0     1     0     0     0     0     0     1     1     0     1     1     0     0     0     0     0     0     1     0     0     0
     1     0     0     0     0     1     0     0     1     0     0     1     1     0     1     0     0     1     0     1     0     1     0     0     1
     0     1     0     0     1     0     0     0     0     0     0     1     0     1     0     0     0     0     0     0     0     1     0     0     0
     0     0     0     0     0     0     0     0     1     0     0     1     0     0     1     0     0     1     0     1     0     1     0     0     1
 
 
F5 =
 
  Columns 1 through 18
 
         0         0         0         0    0.3333         0         0         0         0         0    0.1667    1.0000         0    0.5000    1.0000         0         0         0
         0         0         0         0         0    0.2000         0         0    0.3333         0         0    0.3333    1.0000         0    0.5000         0         0    0.3333
         0         0         0         0    0.3333         0         0         0         0         0         0    0.1429         0    0.5000         0         0         0         0
         0         0         0         0         0         0         0         0         0         0         0    0.3333         0         0    0.3333         0         0    0.3333
 
  Columns 19 through 25
 
         0         0         0    0.1429         0         0         0
         0    0.5000         0    0.5000         0         0    0.3333
         0         0         0    0.1250         0         0         0
         0    0.5000         0    0.5000         0         0    0.3333
 
>>



Saludos.
JOSE JEREMÍAS CABALLERO
Asesorías en Matlab
programador en matlab
Servicios de programación matlab
jjcc94@hotmail.com


http://matlabcaballero.blogspot.com


http://www.lawebdelprogramador.com/foros/Matlab/1371532-FORMA_DE_APRENDER_MATLAB.html
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
Imágen de perfil de JOSE JEREMIAS CABALLERO

Subscripted assignment dimension mismatch

Publicado por JOSE JEREMIAS CABALLERO jjcc94@hotmail.com (3440 intervenciones) el 12/12/2013 16:03:37
1
2
3
4
5
6
7
8
9
10
11
12
13
clear all
raster = [0 1 0 0 1 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 1 0 0 0
 1 0 0 0 0 1 0 0 1 0 0 1 1 0 1 0 0 1 0 1 0 1 0 0 1
 0 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0
 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 1 0 1 0 0 1];
 
 [c,f]=size(raster);
 F5=zeros(c,f);
 for a=1:c
     FV=find(raster(a,:));  % halla en la filas 1 hasta c la posicion de  elementos no nulos
     F5(a,FV(2:end))=1./(FV(2:end)-FV(1:end-1));
 end
 F5


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>> actividad_celular1
 
F5 =
 
  Columns 1 through 15
 
         0         0         0         0    0.3333         0         0         0         0         0    0.1667    1.0000         0    0.5000    1.0000
         0         0         0         0         0    0.2000         0         0    0.3333         0         0    0.3333    1.0000         0    0.5000
         0         0         0         0    0.3333         0         0         0         0         0         0    0.1429         0    0.5000         0
         0         0         0         0         0         0         0         0         0         0         0    0.3333         0         0    0.3333
 
  Columns 16 through 25
 
         0         0         0         0         0         0    0.1429         0         0         0
         0         0    0.3333         0    0.5000         0    0.5000         0         0    0.3333
         0         0         0         0         0         0    0.1250         0         0         0
         0         0    0.3333         0    0.5000         0    0.5000         0         0    0.3333
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