带网格的标量矢量乘法(Matlab)

时间:2019-02-20 10:43:18

标签: matlab vectorization linear-algebra

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

为了进行绘图,我必须使用surf,它对变量a b采用矩阵。因此,我尝试使用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;

这显然是行不通的,因为在这种情况下,矩阵乘积和元素乘积均未得到很好的定义。我实际上如何使表示网格a b的矩阵逐个元素地将向量UV相乘?

2 个答案:

答案 0 :(得分:3)

您要使用逐元素乘法(.*),因为您仍希望将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 );

然后您可以通过绘制i来绘制S的{​​{1}}的第A个随Bs(:,:,i)而变化的元素。

答案 1 :(得分:1)

您可以使用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