Pregunta

Tengo una matriz 2D enorme y me gustaría extraer 15 diferentes 100x100 partes de ella. Tengo dos vectores x e y, donde se guardan los índices superior izquierda de las piezas. He utilizado algo como esto:

result = cam1(x(1:end):(x(1:end)+99), y(1:end):(y(1:end)+99));

pero el resultado es sólo una matriz en lugar de un 15x100x100 100x100. ¿Por qué?

Sé que podría hacerse fácilmente mediante un bucle pero no se les permite usar bucles (que es parte de un ejercicio de procesamiento de imágenes). Otra possbility sería escribir todas las 15 líneas, sino que es un poco feo.

¿Tiene alguna solución elegante? Gracias.

¿Fue útil?

Solución

Hay un número de maneras que usted puede hacer esto sin bucles. La mayoría de las soluciones implican la expansión de los vectores x y y en matrices más grandes de índices y probablemente utilizar una o más de las funciones REPMAT , BSXFUN , o SUB2IND . Un buen tutorial para la indexación de matriz se puede encontrar aquí .

Sin embargo, desde que solicitó la elegante solución, aquí hay uno que es un poco inusual. Utiliza funciones anónimas , así como las funciones ARRAYFUN y CAT :

indexFcn = @(r,c) cam1(r:(r+99),c:(c+99));
result = arrayfun(indexFcn,x,y,'UniformOutput',false);
result = cat(3,result{:});

EXPLICACIÓN:

La primera línea crea un función anónima . Se trata de una simple función de línea que se pueden crear en la marcha sin tener que ponerlo en un archivo-m. La función define dos entradas r y c que se utiliza para extraer una submatriz 100-por-100 de cam1 . La variable indexFcn almacena un identificador de función rel="noreferrer"> que se utiliza para llamar a la función. Tenga en cuenta que los valores de cam1 utilizado por la función anónima son estática . Incluso si los valores de la variable cam1 cambio, la función anónima sigue utilizando los valores que estaban en cam1 cuando se creó la función.

La segunda línea realiza una llamada a ARRAYFUN, que aplica una función a cada elemento de una matriz. bucles ARRAYFUN sobre cada entrada en x y y , que pasa los valores a indexFcn . La salida se almacena en resultado , una matriz de células 15-elemento donde cada célula contiene una matriz de 100-por-100.

La tercera línea utiliza la función de CAT para concatenar las matrices 100-por-100 en una matriz de 100-por-100-por-15.

Otros consejos

Dado que se trata, obviamente, tarea, yo no le dará la respuesta completa.

Hay varias maneras para indexar en una matriz. Cuando se tiene un conjunto de índices dispersos, ya que es, es necesario utilizar un único índice. Así, si

A = rand(5,6)
A =
      0.81472      0.09754      0.15761      0.14189      0.65574      0.75774
      0.90579       0.2785      0.97059      0.42176     0.035712      0.74313
      0.12699      0.54688      0.95717      0.91574      0.84913      0.39223
      0.91338      0.95751      0.48538      0.79221      0.93399      0.65548
      0.63236      0.96489      0.80028      0.95949      0.67874      0.17119

A(3:4,3:4)

dará lugar a una submatriz 2x2 de A. Pero también podemos encontrar que submatriz como

reshape(A([13 14 18 19]),[2 2])
ans =
      0.95717      0.91574
      0.48538      0.79221

¿Por qué elegí este conjunto de índices? Para la respuesta, tendrá que leer sobre sub2ind.

[I,J] = ndgrid(3:4,3:4);
sub2ind([5 6],I(:),J(:))
ans =
    13
    14
    18
    19

Al final, parece que desea una matriz 15x100x100 de las partes extraídas. Así que construir la matriz de índice necesaria a partir de las piezas que he mostrado. Usted tendrá que hacer un cambio de forma definitiva al final para que sea la forma adecuada.

Esto debe darle suficiente cantidad de un principio hasta el final de su tarea.

Se piensa todo momento a lo difícil, intenta éste: mat2cell

scroll top