Matlab для циклического изменения каждой строки и столбца - PullRequest
4 голосов
/ 28 января 2012

Я пытаюсь создать матрицу, которая будет выглядеть следующим образом:

[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.

В общем, мне нужно сказать Matlab, как в цикле for прекратить использование Orig(1,1) и перейти к Orig(1,2) для строки 2.

Ответы [ 2 ]

8 голосов
/ 28 января 2012

Вы можете сделать это с двойной петлей

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);
2 голосов
/ 28 января 2012

try:

n = 5;
OrigArranged = Orig'*ones(1,n);
PowerMat = ones(length(Orig),1) * [1:n];
A = OrigArranged.^PowerMat;

Я протестирую его после установки Octave, но он должен работать.

edit: я исправил мелкие ошибки, теперь он работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...