在Matlab中用循环创建矩阵



我想创建以下形式的矩阵

    Y = [1 x x.^2 x.^3 x.^4 x.^5 ... x.^100]

设x是列向量。或者甚至更多的变体,如

    Y = [1 x1 x2 x3 (x1).^2 (x2).^2 (x3).^2 (x1.x2) (x2.x3) (x3.x1)]

设x1、x2和x3为列向量让我们考虑第一个问题。我试着用之类的东西

    Y = [1 : x : x.^100]

但这也不起作用,因为它意味着取Y=[1x2.*x3.*x…x.^100]?(即介于1到x.^100之间的所有值,差值为x)因此,这也不能用于生成这样的矩阵。请考虑x=[1;2;3;4];并提出一种生成该矩阵的方法

    Y = [1 1 1 1 1;
         1 2 4 8 16;
         1 3 9 27 81;
         1 4 16 64 256];

而无需手动写入

    Y = [ones(size(x,1)) x x.^2 x.^3 x.^4]

使用此bsxfun技术-

N = 5; %// Number of columns needed in output
x = [1; 2; 3; 4]; %// or [1:4]'
Y = bsxfun(@power,x,[0:N-1])

输出-

Y =
     1     1     1     1     1
     1     2     4     8    16
     1     3     9    27    81
     1     4    16    64   256

如果您有x = [1 2; 3 4; 5 6]并且您想要Y = [1 1 1 2 4; 1 3 9 4 16; 1 5 25 6 36],即列向量x1x2…的Y = [ 1 x1 x1.^2 x2 x2.^2 ]。。。,你可以用这一行

[ones(size(x,1),1) reshape(bsxfun(@power,permute(x,[1 3 2]),1:2),size(x,1),[])]

使用Matlabs vander()-Function中的代码的改编版本(也可以在polyfit函数中找到),如果你使用这样的东西,与Divakars漂亮而简短的解决方案相比,你可以获得显著的加速:

N = 5;
x = [1:4]';
V(:,n+1) = ones(length(x),1);
for j = n:-1:1
   V(:,j) = x.*V(:,j+1);
end
V = V(:,end:-1:1);

对于给定的示例,它的速度大约是它的两倍,并且如果我设置N=50x = [1:40]',它将获得大约20倍的速度。尽管我指出,比较时间并不容易,但如果速度是一个问题,作为一种选择,您可能会看看这个解决方案。

在八度音阶中,广播允许写入

N=5;
x = [1; 2; 3; 4];
y = x.^(0:N-1)

输出-

y =
     1     1     1     1     1
     1     2     4     8    16
     1     3     9    27    81
     1     4    16    64   256

相关内容

  • 没有找到相关文章

最新更新