2012-01-31 12 views
5

Tengo una matriz de datos 3D en matlab, pero quiero extraer una porción de datos arbitrariamente rotada de esa matriz y almacenarla como una matriz 2D, que puedo acceso. Similar a cómo la función slice() muestra los datos recortados en cualquier ángulo, excepto que también me gustaría poder ver y modificar los datos como si fuera una matriz.Extracto del plano de datos arbitrariamente rotado de la matriz 3D como matriz 2D

I tienen las coordenadas del punto de pivote del avión, así como los ángulos de rotación (en x, y y z eje), también he calculado la ecuación del plano en la forma:

Ax + By + Cz = D 

y puede extraer una matriz 3D que contiene solo los datos que caen en ese plano, pero no sé cómo convertir eso en una matriz 2D simple.

Otra forma de hacerlo sería girar de algún modo la matriz fuente en la dirección opuesta al ángulo del plano, para alinear el plano de datos con el eje XY, y simplemente extraer esa parte de la matriz , pero no sé si es posible rotar una matriz así.

Espero que esto no haya sido respondido en otro lugar, he estado buscando en Google todo el día, pero ninguno de los problemas parece coincidir exactamente con el mío.

Gracias

+0

¿Necesita solo los datos que caen *** exactamente *** en el avión (que en general será una cantidad muy pequeña de datos) o no quiere interpolar los datos? – yohai

+0

Quiero devolver las celdas más cercanas en lugar de la interpolación, aunque la interpolación se considerará más adelante –

+0

Para aclarar, tiene una matriz con 3 indeces 'A [i, j, k] = a_ijk' y desea crear una matriz de 2 indeces 'B [u, v] = b_uv' donde' u', 'v' son coordenadas en un plano/porción del mundo' i', 'j',' k'? (y todos los indeces son enteros) Además, ¿hay alguna convención en la que 'ijk' corresponde a' u = 1' y 'v = 1'? – ja72

Respuesta

1

Puede echar un vistazo a the code here. Creo que la función es similar a lo que estás tratando de resolver.

function extracts an arbitrary plane from a volume dado el tamaño del plano, el punto central del plano y el plano normal, es decir [A, B, C].También muestra el índice volumétrico y la coordenada de cada píxel en el plano.

0

Aha! Puede que lo haya resuelto yo mismo.

para producir la ecuación en el plano de girar una vector normal de (0,0,1) utilizando matrices de rotación y luego encontrar D. Si giran también los siguientes vectores:

(1,0,0) //step in the x direction of our 2D array 

y

(0,1,0) //step in the y direction of our 2D array 

Tendré los degradados que indican cuánto deben cambiar mis coordenadas en x, y, z antes de pasar a la siguiente columna de mi matriz, o a la siguiente fila.

me burlo de esto lo antes posible y lo marca como la respuesta si funciona

EDIT: Ok ligera alteración, cuando estoy girando mis vectores También debo girar el punto en el espacio 3D que representa el xyz coordenadas de x = 0, y = 0, z = 0 (aunque estoy rotando alrededor del centro de la estructura, entonces en realidad es -sizex/2, -sizey/2, -sizez/2, donde el tamaño es del tamaño de los datos, y luego simplemente agrego el tamaño/2 a cada coordenada después de las rotaciones para traducirlo nuevamente a donde debería estar).

Ahora que tengo el cambio de degradado en 3D a medida que aumente la coordenada x de mi matriz 2D y el gradiente cambian a medida que aumente la coordenada y, simplemente puedo recorrer todas las coordenadas x e y posibles (la matriz resultante ser 50x50 para una matriz de 50x50x50, no estoy seguro de lo que será para tamaños irregulares, lo que necesitaré hacer con el tiempo) en mi matriz 2D y calcular las coordenadas 3D resultantes en mi plano en los datos. Mi valor de esquina girada sirve como punto de partida. ¡Hurra!

Acabo de encontrar una buena prueba para este abarca todos los ángulos y luego voy a aprobar esto como una respuesta

Cuestiones relacionadas