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.

Foi útil?

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 . C deve ser um vector de coluna ( comprimento (C) -by-1) e S deve ser um vector da linha (1-a-passo < strong> comprimento (S) ). Supondo que eles são as dimensões adequadas, basta fazer o seguinte:

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 C (:) remodela o conteúdo de C fortes num único vector de coluna. A sintaxe S (:) ' remodela o conteúdo de S num vector de coluna, em seguida, transpõe para um vector de linha. Quando multiplicado, isto resulta em uma matriz de tamanho ( comprimento (C) -by- comprimento (S) ).

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 ith é o S vector escalado pela entrada ith 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top