Vector a sintaxe Matrix em MATLAB
Pergunta
Existe uma maneira de combinar 2 vetores em MATLAB tal que:
mat = zeros(length(C),length(S));
for j=1:length(C)
mat(j,:)=C(j)*S;
end
Usando a sintaxe MATLAB normal semelhante ao:
mat = C * S(1:length(S))
Isto dá um "dimensões matriz interna deve concordar erro" porque ele está tentando fazer operações de matriz normais. Esta não é uma operação padrão Álgebra Linear então eu não sei como expressá-lo corretamente no MATLAB, mas parece que deve ser possível sem a necessidade de um loop, que é excessivamente lento em MATLAB.
Solução
De sua descrição, parece que uma operação de matriz simples. Você apenas tem que certificar-se de que você tem as dimensões corretas para C e S .
mat = C*S;
Se você não tiver certeza de suas dimensões, isso deve funcionar:
mat = (C(:))*(S(:)');
EDIT: Na verdade, eu fui um pouco louco com os parênteses. Alguns deles são desnecessários, uma vez que não existem preocupações de ordem de operação. Aqui está uma versão mais limpa:
mat = C(:)*S(:)';
EXPLICAÇÃO:
O matriz multiplicação operador em MATLAB produzir quer uma produto interno (resultando em um valor escalar) ou um produto externo (resultando numa matriz) de acordo com as dimensões dos vectores é aplicado a.
A última equação acima produz um produto externo por causa do uso do colon operador para reformular as dimensões dos argumentos do vetor. A sintaxe
Nota: Este uso do operador de cólon é aplicável a vetores e matrizes de qualquer dimensão, o que lhe permite remodelar seu conteúdo em um vetor coluna única (que faz algumas operações mais fácil, como mostra < a href = "https://stackoverflow.com/questions/709872/multi-dimension-any"> este outro SO pergunta ).
Outras dicas
Tente executar isso no MATLAB:
mat = C*S'
Como 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
Você quer dizer o seguinte?
mat = zeros(length(C),length(S));
for j=1:length(C)
mat(j,:)=C(j)*S;
end
Se assim for, é simplesmente matriz multiplicação:
C' * S % if C and S are row vectors
C * S' % if C and S are column vectors
Se você não sabe se C
e S
são vetores linha ou vetores coluna, você pode usar um truque para transformá-los em vetores coluna, então S
transposta antes multiplicando-os:
C(:) * S(:)'
Eu não sou inteiramente claro sobre o que você está fazendo - parece que sua matriz resultante será composto de linhas length(C)
, onde a linha i
th é o S
vector escalado pela entrada i
th de C
(desde subscripting um vetor dá uma escalar). Neste caso, você pode fazer algo como
mat = repmat(C,[1 length(S)]) .* repmat(S, [length(C) 1])
onde telha C
em colunas, e S
baixo linhas.
Tente isto:
C = 1: 3 S = 1: 5 mat1 = C «* S
= mat2 bsxfun (@times, C', S)
(esp. Boa quando a função que você precisa é notação MATLAB não mais simples)
- Loren
Tente usar meshgrid:
[Cm, Sm] = meshgrid(C, S);
mat = Cm .* Sm;
edit: Nevermind, multiplicação de matrizes fará também. Você só precisa de um vetor coluna C e um vetor linha S. Em seguida, faça C * S.