12

x=1:100N=1:10。我想创建一个矩阵x^N,以便i第 th列包含条目[1 i i^2 ... i^N]

我可以使用 for 循环轻松做到这一点。但是有没有办法使用矢量化代码来做到这一点?

4

5 回答 5

11

我会去:

x = 1:100;
N = 1:10;
Solution = repmat(x,[length(N)+1 1]).^repmat(([0 N])',[1 length(x)]);

另一种解决方案(可能更有效):

Solution = [ones(size(x)); cumprod(repmat(x,[length(N) 1]),1)];

甚至:

 Solution = bsxfun(@power,x,[0 N]');

希望这可以帮助。

于 2010-10-13T10:18:14.710 回答
6

听起来像范德蒙德矩阵。所以使用范德

A = vander(1:100);
A = A(1:10, :);
于 2010-10-13T16:05:07.597 回答
5

由于您的矩阵不是那么大,因此最直接的方法是使用MESHGRID和逐元素幂运算符 .^

[x,N] = meshgrid(1:100,0:10);
x = x.^N;

这将创建一个 11×100 矩阵,其中每列i包含[i^0; i^1; i^2; ... i^10].

于 2010-10-13T14:30:24.503 回答
2

不确定它是否真的适合您的问题。

bsxfun(@power, cumsum(ones(100,10),2), cumsum(ones(100,10),1))

编辑: 正如 Adrien 所指出的,我的第一次尝试不符合 OP 问题。

xn = 100;
N=10;
solution = [ones(1,xn); bsxfun(@power, cumsum(ones(N,xn),2), cumsum(ones(N,xn),1))];
于 2010-10-13T08:37:11.260 回答
1

为什么不使用易于理解的 for 循环?

c = [1:10]'; %count to 100 for full scale problem
for i = 1:4; %loop to 10 for full scale problem
    M(:,i) = c.^(i-1)
end

理解人们展示的这段代码的巧妙矢量化版本需要更多的思考。我的方式更像是一种野蛮的做事方式,但任何阅读它的人都会理解它。

我更喜欢易于理解的代码。

(是的,我可以预先分配。对于像这样的小案例,不值得降低清晰度。)

于 2010-10-13T17:53:45.553 回答