【问题标题】:Vector to Matrix syntax in MATLABMATLAB 中的向量到矩阵语法
【发布时间】:2023-03-19 11:59:01
【问题描述】:

有没有办法在 MATLAB 中组合两个向量:

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 中太慢了。

【问题讨论】:

  • 我认为你有一个错字。 "mat(1,:) = ..." 行将简单地覆盖第一行,对其余行不做任何事情。你的意思是说“mat(j,:) = ...”吗?
  • 是的,你是对的,它应该是 mat(j,:)。对此感到抱歉。
  • 没问题。我修复了它以避免任何进一步的混乱。 =)

标签: matlab matrix vector


【解决方案1】:

根据您的描述,这听起来像是一个简单的矩阵运算。您只需要确保 CS 具有正确的尺寸。 C 应该是列向量(length(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 的内容重塑为列向量,然后将其转置为行向量。相乘时,得到一个大小为 (length(C)-by-length(S)) 的矩阵。

注意:这种冒号操作符的使用适用于任意维度的向量和矩阵,可以让你将它们的内容重新整形为一个单列向量(这使得一些操作更容易,如@所示987654325@)。

【讨论】:

  • 为什么底部表达式产生的结果与顶部表达式不同?看起来像 C = C(:)。我不明白这里发生了一些微妙的事情。
  • @Pete:我会在答案中添加解释以使其更清楚。
  • 我读了你的解释并想,如果你的说法是正确的,那么 C'*S 应该可以工作,你瞧,它确实有效。所以真正的问题只是列向量与行向量相乘的顺序。甜的。谢谢。
  • 很高兴为您提供帮助。 C 和 S 必须都是从行向量开始,在这种情况下 C'*S 和 C(:)*S 做同样的事情。更一般的 C(:)*S(:)' 仅在您不知道 C 和 S 是行向量还是列向量但仍想与它们执行外积时才真正需要。
  • 我一直认为括号是“索引运算符”,而 C(:,x) 是 C(1:length(C),x) 的简写。操作的细微之处并没有在文档中真正突出显示。有点有趣,他们比语言本身更好地记录库。
【解决方案2】:

尝试在 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

【讨论】:

    【解决方案3】:

    你的意思是以下吗?

    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(:)'
    

    【讨论】:

      【解决方案4】:

      我不完全清楚你在做什么 - 看起来你的结果矩阵将由 length(C) 行组成,其中 ith 行是向量 Sith 缩放C 的条目(因为下标向量给出一个标量)。在这种情况下,您可以执行类似的操作

      mat = repmat(C,[1 length(S)]) .* repmat(S, [length(C) 1])
      

      C 跨列平铺,S 向下平铺。

      【讨论】:

        【解决方案5】:

        试试这个:

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

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

        (尤其是当您需要的函数不是更简单的 MATLAB 表示法时很好)

        --洛伦

        【讨论】:

          【解决方案6】:

          尝试使用网格网格:

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

          编辑:没关系,矩阵乘法也可以。你只需要一个列向量C和一个行向量S。然后做C * S。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-01-12
            • 2014-01-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多