用于循环改变每行的Matlab&柱

时间:2012-01-28 16:21:12

标签: matlab for-loop matrix

我正在尝试创建一个如下所示的矩阵:

[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行。

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中编程的方式。

相反,您要复制Origexponent,并在一个矢量化操作中进行计算:

%# 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后我会测试它,但它应该可以工作。

编辑:我已经纠正了小错误,现在可行了