有没有办法在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中过于缓慢。
答案 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
如果您不知道C
和S
是行向量还是列向量,您可以使用技巧将它们转换为列向量,然后在将它们相乘之前转置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。