Los complejos de Matlab

Tengo dos matrices: la matriz {a} <252x1> es un subconjunto de la matriz {b} <252x4000>. Necesito determinar la cantidad de días antes y después de que ocurrieran los valores de la matriz {a} en la matriz {b}.

Example:

Matrix a  Matrix b
10       12 34 54 10
23       23 98 78 98
43       98 53 43 88
44       98 44 88 78

Output
1  1  1  10
23 1  1  1
1  1  43 1
1  44 1  1

Days
3 0
0 3
2 1
1 2

preguntado el 31 de julio de 12 a las 14:07

2 Respuestas

Esta respuesta asume que solo hay una coincidencia por fila:

a = [10;23;43;44]
b = [12 34 45 10;23 98 78 98;98 53 43 88; 98 44 88 78]
l = bsxfun(@eq, a, b)
[c r] = find(l')
Days = [c - 1, size(b, 2) - c]
Output = b.*l + ~l

Si la suposición es mala, creo que será mejor usar bucles.

Respondido 31 Jul 12, 14:07

Si la suposición es mala, ¿cómo implementaría los bucles for? - Buntalán

Comience aquí: l = bsxfun(@eq, a, b) y pruébelo. Publica tu código si te quedas atascado. - Dan

Suponiendo que hay exactamente una ocurrencia de a in b por fila:

Utilice las bsxfun para obtener result:

result=ones(size(b));
ainb=bsxfun(@eq,a,b);
result(ainb)=b(ainb);

Encuentre el índice de la columna donde a es en b usar encontrar con dos argumentos de salida, y deduzca el número de días a partir de eso:

[colidx_rev,~] = find(ainb);
colidx(colidx_rev,1) = 1:4;

Days = [colidx-1 size(b,2)-colidx];

Vería que hay varias coincidencias por fila cuando any(sum(ainb,2)>1). Lo siguiente que debe hacer es seleccionar uno (por ejemplo, el primer partido). Haga esto encontrando los índices de columna de otra manera, usando un ciclo o más corto usando arrayfun:

col_idx = arrayfun(@(rowi) find(ainb(rowi,:),1),1:size(b,1))';

el resto es parecido.

Respondido 31 Jul 12, 15:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.