MATLAB中的向量矩阵语法

时间:2009-06-23 17:23:03

标签: matlab matrix vector

有没有办法在MATLAB中组合2个向量,以便:

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

使用类似于的正常MATLAB语法:

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

这给出了“内部矩阵尺寸必须一致的错误”,因为它试图进行正常的矩阵运算。这不是一个标准的线性代数运算,所以我不确定如何在MATLAB中正确表达它,但似乎应该可以在不需要循环的情况下实现,这在MATLAB中过于缓慢。

6 个答案:

答案 0 :(得分:5)

从您的描述中,它听起来像一个简单的矩阵操作。您只需确保 C S 的尺寸合适。 C 应为列向量(长度(C) -by-1), S 应为行向量(1-by- <强>长度(S))。假设它们是正确的尺寸,请执行以下操作:

mat = C*S;

如果你不确定它们的尺寸,这应该有效:

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

编辑:实际上,我对括号感到有点疯狂。其中一些是不必要的,因为没有操作顺序问题。这是一个更清洁的版本:

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

<强>说明

MATLAB中的matrix multiplication operator将产生inner product(产生标量值)或outer product(产生矩阵),具体取决于应用的向量的维数到。

上面的最后一个等式产生了外部产品,因为使用colon operator来重塑矢量参数的维度。语法 C(:) C 的内容重塑为单个列向量。语法 S(:)' S 的内容重新整形为列向量,然后将其转换为行向量。当相乘时,会产生一个大小矩阵(长度(C) -by- 长度(S))。

注意:冒号运算符的使用适用于任何维度的向量和矩阵,允许您将其内容重新整形为单个列向量(这使得某些操作更容易,如{ {3}})。

答案 1 :(得分:4)

尝试在MATLAB中执行:

mat = C*S'

如同:

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

答案 2 :(得分:2)

你的意思是以下几点吗?

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

如果是这样,它只是矩阵乘法:

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

如果您不知道CS是行向量还是列向量,您可以使用技巧将它们转换为列向量,然后在将它们相乘之前转置S

C(:) * S(:)'

答案 3 :(得分:1)

我不清楚你在做什么 - 看起来你的结果矩阵将包含length(C)行,其中i行是矢量S缩放通过i的{​​{1}}条目(因为下标向量给出标量)。在这种情况下,您可以执行类似

的操作
C

您可以在列之间平铺mat = repmat(C,[1 length(S)]) .* repmat(S, [length(C) 1]) ,在行中放置C

答案 4 :(得分:1)

试试这个:

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

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

(特别是当你需要的功能不是简单的MATLAB表示法时)

- 洛伦

答案 5 :(得分:0)

尝试使用meshgrid:

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

编辑:nevermind,矩阵乘法也会这样做。你只需要一个列向量C和一个行向量S.然后做C * S。