Question

Existe-t-il un moyen de combiner 2 vecteurs dans MATLAB tels que:

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

Utilisation d'une syntaxe MATLAB normale semblable à:

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

Ceci donne une erreur "Les dimensions internes de la matrice doivent correspondre à l'erreur". parce qu'il essaie de faire des opérations matricielles normales. Ce n'est pas une opération standard d'algèbre linéaire, je ne sais donc pas comment l'exprimer correctement dans MATLAB, mais il me semble que cela devrait être possible sans nécessiter de boucle, ce qui est excessivement lent dans MATLAB.

Était-ce utile?

La solution

D'après votre description, cela ressemble à une opération matricielle simple. Vous devez simplement vous assurer que vous avez les bonnes dimensions pour C et S . C doit être un vecteur colonne ( longueur (C) -by-1) et S un vecteur ligne (1-sur- < forte> longueur (S) ). En supposant que ce soient les bonnes dimensions, procédez comme suit:

mat = C*S;

Si vous n'êtes pas sûr de leurs dimensions, cela devrait fonctionner:

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

MODIFIER: En fait, je suis devenu un peu fou avec les parenthèses. Certaines d'entre elles sont inutiles, car il n'y a pas de problèmes d'ordre d'ordre. Voici une version plus propre:

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

EXPLICATION:

L’opérateur de la multiplication de matrice dans MATLAB produire un produit intérieur (ce qui donne une valeur scalaire) ou un produit externe (résultant en une matrice) en fonction des dimensions des vecteurs auxquels il est appliqué.

La dernière équation ci-dessus produit un produit externe en raison de l'utilisation de opérateur du côlon pour remodeler les dimensions des arguments de vecteur. La syntaxe C (:) remodèle le contenu de C en un seul vecteur de colonne. La syntaxe S (:) ' remodèle le contenu de S en un vecteur colonne, puis le transpose en un vecteur ligne. Lorsque multiplié, cela donne une matrice de taille ( longueur (C) par longueur (S) ).

Remarque: Cette utilisation de l'opérateur deux points est applicable aux vecteurs et matrices de toutes les dimensions, ce qui vous permet de remodeler leur contenu dans un seul vecteur de colonne (ce qui facilite certaines opérations, comme le montre < a href = "https://stackoverflow.com/questions/709872/multi-dimension-any"> cette autre question SO ).

Autres conseils

Essayez d’exécuter ceci dans MATLAB:

mat = C*S'

Comme dans:

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

Voulez-vous dire ce qui suit?

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

Si c'est le cas, il s'agit simplement d'une multiplication matricielle:

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

Si vous ne savez pas si C et S sont des vecteurs de lignes ou de colonnes, vous pouvez utiliser une astuce pour les transformer en vecteurs de colonnes, puis transposez S avant de les multiplier:

C(:) * S(:)'

Je ne suis pas tout à fait clair de ce que vous faites - il semble que votre matrice résultante se compose de longueur (C) lignes, où la i e ligne est le vecteur S mis à l'échelle par le i ème entrée de C (car l'indication d'un vecteur donne un scalaire). Dans ce cas, vous pouvez faire quelque chose comme

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

l'endroit où vous insérez C dans les colonnes et S dans les lignes inférieures.

Essayez ceci:

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

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

(particulièrement utile lorsque la fonction dont vous avez besoin n’est pas plus simple que la notation MATLAB)

- Loren

Essayez d’utiliser meshgrid:

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

edit: tant pis, la multiplication de matrice le fera aussi. Vous avez juste besoin d’un vecteur colonne C et d’un vecteur ligne S. Ensuite, faites C * S.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top