2009-12-21 24 views
6

Me gustaría agregar dos vectores con diferentes longitudes en Matlab u Octave. P.ej.¿Cómo agregar vectores con diferente longitud?

aa = [1 2 3 4]; 
bb = [100 100]; 

que debería traducirse en un vector que contiene cc

cc = [101 102 3 4] 

¿Alguien puede encontrar la manera de hacer esto?

Actualización: Este es el código con el que terminé para las señales que luego convierto en imágenes de escala de grises.

load train; 
t = y; 
load chirp; 
c = y; 

tc = c + [t; zeros(length(c) - length(t),1)]; 

plot(1:length(tc),tc) 

Muchas gracias a todos ustedes =)

Respuesta

6

Esto no tiene ningún sentido matemáticamente, pero si insiste, usted puede hacer esto:

cc = aa + [bb zeros(1,2)]; 
+0

fresca. Es porque tengo 2 matrices, que en realidad son imágenes en escala de grises que me gustaría agregar. Así que ahora me gustaría generalizar su solución a matrices =) – Louise

+2

-1: tiene sentido matemáticamente en algunos casos. –

+0

sí lo hace, por ejemplo, cuando se tratan señales como vectores (significa la transformada z) –

4

yo no tengo MATLAB utilizado en diez años, pero creo que vas a tener que hacer algo como:

cc = aa + [bb zeros(1, length(aa) - length(bb))] 
+0

Se obtiene "Error: paréntesis o paréntesis no balanceados o inesperados". Pero "cc = aa + [bb zeros (1, length (bb))];" está funcionando =) – Louise

+1

@Louise, mi mal, debería haber sido 'length' y no' size'. Que 'ceros (1, longitud (bb))' funciona es solo una coincidencia ya que 'longitud (bb) = longitud (aa) - longitud (bb)'. –

+0

Cool. Gracias por aclarar eso. – Louise

9

para el caso 1-D se trata de un conjunto de vectores, las otras respuestas señalan las soluciones correctas (que implican rellenar el vector más corto con ceros o realizar la adición usando un subíndice en el vector más largo). Sin embargo, como mencionaste en un comentario que finalmente deseas agregar dos imágenes en escala de grises juntas, pensé que te mostraría una solución bidimensional más general para matrices.

En primer lugar, voy a cargar algunos incorporados en imágenes de la muestra de MATLAB y obtener sus tamaños:

image1 = rgb2gray(imread('peppers.png')); 
image2 = imread('cameraman.tif'); 
[r1, c1] = size(image1); 
[r2, c2] = size(image2); 

en cuenta que Convertí la imagen RGB a escala de grises utilizando primero rgb2gray. A continuación, voy a hacer una nueva matriz de ceros cuyo tamaño es el máximo de los tamaños de las dos imágenes:

newImage = zeros(max(r1, r2), max(c1, c2), 'uint8'); 

Tenga en cuenta que he incluido 'uint8' en la llamada a zeros, ya que desea que la matriz de ceros a ser del mismo tipo que sus imágenes para que las siguientes operaciones funcionen correctamente. La matriz newImage ahora es lo suficientemente grande como para contener cualquiera de las dos imágenes. Por último, las imágenes se pueden agregar a la nueva imagen de este modo:

newImage(1:r1, 1:c1) = image1;      % Insert image 1 
newImage(1:r2, 1:c2) = newImage(1:r2, 1:c2)+image2; % Add image 2 

y se puede ver con lo siguiente:

imagesc(newImage); 
colormap(gray); 

enter image description here

NOTA: Una cosa importante considere es el tipo que usa para las imágenes. Normalmente, los datos de imagen que se cargan en MATLAB son del tipo uint8. Sin embargo, puede observar que agregar dos imágenes enteras sin signo de 8 bits como lo hice anteriormente puede resultar en saturación donde los píxeles exceden el valor de 255 (el valor máximo para un entero sin signo de 8 bits). El resultado es que las partes de la imagen se ven de color blanco brillante y pierden detalles (observe algunos de los pimientos que se superponen con la imagen más pequeña que se muestra arriba). Es posible que desee evitar esto escalando los valores en sus imágenes antes de agregarlos, o convirtiendo sus imágenes al tipo double para realizar las operaciones y luego escalarlas antes de volver a guardar la imagen.

+0

¡GUAU! ¡Muchas gracias por esa solución tan detallada! Eso fue exactamente lo que quería hacer. =) – Louise

1

Si es un hecho que AA es más grande que bb, entonces me gustaría hacer esto:

cc = aa; 
cc(1:length(bb)) = cc(1:length(bb)) + bb; 
Cuestiones relacionadas