我正在尝试创建一个如下所示的矩阵:
[1 x x^2 x^3 x^4 x^5]
[1 y y^2 y^3 y^4 y^5]
[1 z z^2 z^3 z^4 z^5]
等等。将具有x,y,z,k等基本值的矩阵为Orig
:
Orig = [ x y z k];
我的起始矩阵将是
A = [1 x x^2 x^3 x^4 x^5];
我的下一行代码是
for i=(2:10)
A(i)=A(i)^A(:,i)
end
这个for循环正确地改变了每行需要提升的功率,但它不会转到我的Orig
矩阵中的下一个值。
基本上,我需要在for循环中告诉Matlab停止使用Orig(1,1)
并转到Orig(1,2)
第2行。
答案 0 :(得分:8)
你可以用双循环
来做到这一点Orig = [x y z k];
exponent = [0 1 2 3 4 5];
%# preassign output to speed up loop
output = zeros(length(Orig),length(exponent));
%# loop over all elements in Orig
for r = 1:length(Orig)
%# loop over all exponents
for c = 1:length(exponent)
output(r,c) = Orig(r)^exponent(c);
end
end
然而,这不是你通常在Matlab中编程的方式。
相反,您要复制Orig
和exponent
,并在一个矢量化操作中进行计算:
%# transpose orig so that it is a n-by-1 array
repOrig = repmat(Orig',1,length(exponent); %'#
repExp = repmat(exponent,length(Orig),1);
%# perform the exponent operation in one go
output = repOrig .^ repExp; %# note the ".", it applies operations element-wise
几年以来,使用函数bsxfun创建了一个快捷版本。这将自动执行我们在repmat
上执行的扩展,并且速度会更快。
output = bsxfun(@power, Orig', exponent);
答案 1 :(得分:2)
尝试:
n = 5;
OrigArranged = Orig'*ones(1,n);
PowerMat = ones(length(Orig),1) * [1:n];
A = OrigArranged.^PowerMat;
安装Octave后我会测试它,但它应该可以工作。
编辑:我已经纠正了小错误,现在可行了