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.

È stato utile?

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 S prima di moltiplicarli:

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top