Sintassi del vettore e della matrice in MATLAB
Domanda
Esiste un modo per combinare 2 vettori in MATLAB in modo tale che:
mat = zeros(length(C),length(S));
for j=1:length(C)
mat(j,:)=C(j)*S;
end
Utilizzo della normale sintassi MATLAB simile a:
mat = C * S(1:length(S))
Questo dà un "quotato dimensioni della matrice interna devono concordare errore" perché sta provando a fare normali operazioni a matrice. Questa non è un'operazione standard di algebra lineare, quindi non sono sicuro di come esprimerla correttamente in MATLAB, ma sembra che dovrebbe essere possibile senza richiedere un ciclo, che è eccessivamente lento in MATLAB.
Soluzione
Dalla tua descrizione, sembra una semplice operazione a matrice. Devi solo assicurarti di avere le giuste dimensioni per C e S . C dovrebbe essere un vettore di colonna ( lunghezza (C) -by-1) e S dovrebbe essere un vettore di riga (1 per- < strong> lunghezza (S) ). Supponendo che abbiano le giuste dimensioni, basta fare quanto segue:
mat = C*S;
Se non sei sicuro delle loro dimensioni, dovrebbe funzionare:
mat = (C(:))*(S(:)');
EDIT: In realtà, sono diventato un po 'matto con le parentesi. Alcuni di essi non sono necessari, poiché non vi sono problemi di ordine di funzionamento. Ecco una versione più pulita:
mat = C(:)*S(:)';
SPIEGAZIONE:
operatore di moltiplicazione di matrici in MATLAB produrre un prodotto interno (risultante in un valore scalare) o un prodotto esterno (risultante in una matrice) a seconda delle dimensioni dei vettori a cui è applicato.
L'ultima equazione sopra produce un prodotto esterno a causa dell'uso del operatore due punti per rimodellare le dimensioni degli argomenti vettoriali. La sintassi C (:) rimodella il contenuto di C in un vettore a colonna singola. La sintassi S (:) ' rimodella il contenuto di S in un vettore di colonna, quindi lo traspone in un vettore di riga. Se moltiplicato, si ottiene una matrice di dimensioni ( lunghezza (C) -by- lunghezza (S) ).
Nota: questo uso dell'operatore due punti è applicabile a vettori e matrici di qualsiasi dimensione, consentendo di rimodellare il loro contenuto in un vettore a colonna singola (che semplifica alcune operazioni, come mostrato da < a href = "https://stackoverflow.com/questions/709872/multi-dimension-any"> questa altra domanda SO ).
Altri suggerimenti
Prova a eseguirlo in MATLAB:
mat = C*S'
Come in:
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
Intendi quanto segue?
mat = zeros(length(C),length(S));
for j=1:length(C)
mat(j,:)=C(j)*S;
end
In tal caso, è semplicemente una moltiplicazione matriciale:
C' * S % if C and S are row vectors
C * S' % if C and S are column vectors
Se non sai se C
e S
sono vettori di riga o vettori di colonna, puoi usare un trucco per trasformarli in vettori di colonna, quindi trasporre
C(:) * S(:)'
Non sono del tutto chiaro su cosa stai facendo - sembra che la tua matrice risultante sarà composta da length (C)
, dove la i
è il vettore S
ridimensionato dalla i
th voce di C
(poiché la sottoscrizione di un vettore fornisce uno scalare). In questo caso, puoi fare qualcosa del genere
mat = repmat(C,[1 length(S)]) .* repmat(S, [length(C) 1])
dove affianchi C
tra le colonne e S
verso il basso.
Prova questo:
C = 1: 3 S = 1: 5 mat1 = C '* S
mat2 = bsxfun (@times, C ', S)
(specialmente se la funzione di cui hai bisogno non è la semplice notazione MATLAB)
- Loren
Prova a utilizzare meshgrid:
[Cm, Sm] = meshgrid(C, S);
mat = Cm .* Sm;
edit: nevermind, lo farà anche la moltiplicazione di matrici. Hai solo bisogno di un vettore di colonna C e di un vettore di riga S. Quindi esegui C * S.