如何在matlab中给定n自动生成矩阵

时间:2018-10-10 22:51:33

标签: matlab

对于线性回归,我想为n次多项式生成矩阵。

如果n为1

X=[x(:), ones(length(x),1)]

如果n为2

X=[x(:).^2 x(:) ones(length(x),1)]

...

如果n为5

X=[x(:).^5 x(:).^4 x(:).^3 x(:).^2 x(:) ones(length(x),1)]

如果我设置n = 6,我不知道如何使用matlab进行编码,它将自动生成所需的X矩阵。希望你能帮助我。

3 个答案:

答案 0 :(得分:3)

这可以通过bsxfun轻松完成:

X = bsxfun(@power, x(:), n:-1:0);

或者,在从R1016b开始的Matlab版本中,您可以使用implicit expansion

X = x(:).^(n:-1:0);

答案 1 :(得分:0)

签出polyval功能。我相信这会满足您的需求。

要增加多项式以增加次数,可以使用循环来增加x = matrix(rnorm(1000*1000),ncol=1000) microbenchmark::microbenchmark(.colSums(x,1000,1000), colSums(x),Rfast::colsums(x,parallel=0), Rfast::colsums(x,parallel=1),times=1000) Unit: microseconds expr min lq mean median uq max neval .colSums(x, 1000, 1000) 1313.268 1336.3600 1366.5152 1344.486 1355.1760 2468.310 1000 colSums(x) 1350.473 1366.2950 1401.0574 1374.420 1386.8210 2826.241 1000 Rfast::colsums(x, parallel = 0) 755.205 769.7440 801.5617 779.152 796.6850 1796.068 1000 Rfast::colsums(x, parallel = 1) 604.249 637.8185 680.3327 651.289 674.1675 1808.042 1000 x = matrix(rnorm(100000*100),ncol=100) microbenchmark::microbenchmark(.colSums(x,100000,100), colSums(x),Rfast::colsums(x,parallel=0), Rfast::colsums(x,parallel=1),times=1000) Unit: milliseconds expr min lq mean median uq max neval .colSums(x, 1e+05, 100) 12.910733 12.971671 13.124897 13.011441 13.087346 26.914502 1000 colSums(x) 12.944944 13.012511 13.142074 13.058268 13.128400 14.879138 1000 Rfast::colsums(x, parallel = 0) 6.988414 7.009796 7.165310 7.068810 7.154765 16.826589 1000 Rfast::colsums(x, parallel = 1) 4.061679 4.251977 4.373995 4.296451 4.385827 7.610196 1000 参数的长度。

答案 2 :(得分:0)

如果您编写edit polyfit,则可以看到MATLAB如何实现了polyfit命令,该命令与您尝试执行的操作类似。在其中找到代码

% Construct the Vandermonde matrix V = [x.^n ... x.^2 x ones(size(x))]
V(:,n+1) = ones(length(x),1,class(x));
for j = n:-1:1
    V(:,j) = x.*V(:,j+1);
end

这将构造您感兴趣的矩阵。此方法相对于bsxfun的好处是您只计算x(:).^n,然后保存中间结果。而不是将所有权力视为单独的问题,例如x(:)^(n-1)作为x(:).^n的另一个问题。