【问题标题】:Scalar-Vector multiplication with meshgrid (Matlab)标量向量乘法与网格(Matlab)
【发布时间】:2019-07-14 00:40:12
【问题描述】:

我有一个表达式,例如 s=aU+bV,其中 ab 是标量,UV 是三分量向量。输出s 显然是一个三分量向量。假设我想绘制s 的第一个组件,找出当我更改ab 时它的变化情况。

为了绘图,我必须使用 surf,它为变量 ab 提供矩阵。所以我尝试用meshgrid创建矩阵:

A=0:10;
B=1:10;
[a,b]=meshgrid(A,B);

U=[1,1,0];
V=[1,0,1];

s = a*U + b*V;

这显然不起作用,因为在这种情况下,矩阵乘积和元素乘积都没有得到很好的定义。我如何实际制作代表网格ab 的矩阵将向量UV 逐个元素相乘?

【问题讨论】:

  • 但是如果你只想检查s的第一个组件,你需要做的就是使用UV的第一个组件。为什么要把事情复杂化?
  • @CrisLuengo 我想他们只是将其用作示例,并且希望单独检查所有组件。
  • @MrAzzaman 没错!

标签: matlab vectorization linear-algebra


【解决方案1】:

您希望使用逐元素乘法 (.*),因为您仍希望将 ab 视为标量(即单独使用每个元素)。

您可以制作 3D 输出,其中每个 2D 切片对应于您的 meshgrid 输出,UV 的每个组件都有一个切片。因此在这个例子中得到一个10*11*3 矩阵。

为此,只需将reshapeUV 向量的大小设为1*1*3

U = reshape( [1,1,0], 1, 1, [] ); % Or equivalently U(1,1,:) = [1,1,0]
V = reshape( [1,0,1], 1, 1, [] ); % Or equivalently U(1,1,:) = [1,0,1]

然后进行逐元素乘法

s = a.*U + b.*V;

注意:在 MATLAB R2016b 之前(引入隐式扩展时)您必须使用 bsxfun 来获得等效项:

s = bsxfun( @times, a, U ) + bsxfun( @times, b, V );

然后您可以通过绘制s(:,:,i) 来绘制Sith 元素随AB 的变化。

【讨论】:

    【解决方案2】:

    您可以使用 3D 矩阵来做到这一点:

    [A,B] = meshgrid(0:10,1:10);
    U(1,1,:) = [1,1,0];
    V(1,1,:) = [1,0,1];
    s = A.*U + B.*V;
    % s is now a NxMx3 matrix, where N = length(A) and M = length(B)
    
    % We can plot how s varies with a and b as follows
    surf(A,B,s(:,:,1)); % first component
    surf(A,B,s(:,:,2)); % second component
    surf(A,B,s(:,:,3)); % third component
    

    【讨论】:

      猜你喜欢
      • 2020-03-16
      • 1970-01-01
      • 1970-01-01
      • 2020-11-19
      • 2013-04-04
      • 1970-01-01
      • 2014-11-24
      • 1970-01-01
      • 2021-12-04
      相关资源
      最近更新 更多