Pregunta

¿Hay alguna manera de combinar 2 vectores en MATLAB de modo que:

mat = zeros(length(C),length(S));
for j=1:length(C)
    mat(j,:)=C(j)*S;
end

Uso de la sintaxis normal de MATLAB similar a:

mat = C * S(1:length(S))

Esto proporciona una " Las dimensiones de la matriz interna deben coincidir con el error " porque está tratando de hacer operaciones matriciales normales. Esta no es una operación estándar de álgebra lineal, así que no estoy seguro de cómo expresarla correctamente en MATLAB, pero parece que debería ser posible sin requerir un bucle, que es excesivamente lento en MATLAB.

¿Fue útil?

Solución

De su descripción, suena como una simple operación matricial. Solo tiene que asegurarse de tener las dimensiones correctas para C y S . C debe ser un vector de columna ( longitud (C) -by-1) y S debe ser un vector de fila (1-por- < strong> length (S) ). Asumiendo que son las dimensiones correctas, simplemente haga lo siguiente:

mat = C*S;

Si no está seguro de sus dimensiones, esto debería funcionar:

mat = (C(:))*(S(:)');

EDITAR: En realidad, me volví un poco loco con los paréntesis. Algunos de ellos son innecesarios, ya que no existen problemas de orden de operación. Aquí hay una versión más limpia:

mat = C(:)*S(:)';

EXPLICACIÓN :

El operador de multiplicación de matrices en MATLAB producir un producto interno (que da como resultado un valor escalar) o un producto externo (que resulta en una matriz) dependiendo de las dimensiones de los vectores a los que se aplica.

La última ecuación anterior produce un producto externo debido al uso de operador de dos puntos para remodelar las dimensiones de los argumentos vectoriales. La sintaxis C (:) cambia la forma del contenido de C en un solo vector de columna. La sintaxis S (:) ' cambia la forma del contenido de S en un vector de columna, luego lo transpone en un vector de fila. Cuando se multiplica, esto da como resultado una matriz de tamaño ( longitud (C) -por- longitud (S) ).

Nota: este uso del operador de dos puntos es aplicable a vectores y matrices de cualquier dimensión, lo que le permite cambiar su contenido en un solo vector de columna (lo que facilita algunas operaciones, como se muestra en < a href = "https://stackoverflow.com/questions/709872/multi-dimension-any"> esta otra pregunta SO ).

Otros consejos

Intente ejecutar esto en MATLAB:

mat = C*S'

Como en:

C = [1; 2; 3];
S = [2; 2; 9; 1];

mat = zeros(length(C),length(S));
for j=1:length(C)
    mat(j,:)=C(j)*S;
end

% Equivalent code:
mat2 = C*S';

myDiff = mat - mat2

¿Te refieres a lo siguiente?

mat = zeros(length(C),length(S));
for j=1:length(C)
    mat(j,:)=C(j)*S;
end

Si es así, es simplemente multiplicación matricial:

C' * S    % if C and S are row vectors
C * S'    % if C and S are column vectors

Si no sabe si C y S son vectores de fila o de columna, puede usar un truco para convertirlos en vectores de columna y luego transponer S antes de multiplicarlos:

C(:) * S(:)'

No tengo del todo claro qué está haciendo: parece que su matriz resultante consistirá en filas length (C) , donde la fila i es el vector S escalado por la entrada i th de C (dado que suscribir un vector da un escalar). En este caso, puede hacer algo como

mat = repmat(C,[1 length(S)]) .* repmat(S, [length(C) 1])

donde coloca mosaico C en las columnas y S hacia abajo de las filas.

Prueba esto:

C = 1: 3 S = 1: 5 mat1 = C '* S

mat2 = bsxfun (@times, C ', S)

(especialmente bueno cuando la función que necesita no es una notación MATLAB más simple)

--Loren

Intente usar meshgrid:

[Cm, Sm] = meshgrid(C, S);
mat = Cm .* Sm;

editar: no importa, la multiplicación de matrices también lo hará. Solo necesita un vector de columna C y un vector de fila S. Luego haga C * S.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top