Эта функция MATLAB возвращает вектор результатов - PullRequest
3 голосов
/ 10 февраля 2011

Если у меня есть функция в MATLAB , и внутри нее у меня есть цикл, который вычисляет две переменные, что-то вроде:

for index = 1:1000,
    var1 = 0.0;
    var2 = zeros(size(someMatrix));
    ...
    %some calculus...
    ...
end

Как определить функцию, возвращающую эти две переменные, но со всеми изменениями, которые они перенесли в цикле, например

var1 = [1, 3, 5, 7]
var2 = some matrix,

Таким образом, вместо этого функция возвращает единственное значение. Как вернуть вектор результатов, полученных из цикла?

Ответы [ 2 ]

7 голосов
/ 10 февраля 2011

Если бы я знал, что вы пытаетесь сделать на более высоком уровне, я мог бы дать вам лучший совет.Когда я читаю этот вопрос, я спрашиваю себя: «Зачем ему это делать?».Скорее всего, есть гораздо лучший способ сделать то, что вы пытаетесь сделать.

При этом, я думаю, вы пытаетесь сделать что-то подобное.

function [x y] = foo
x = 0;
y = 0;
for i = 1:100
  if x(end)<i
      x(end+1)=i^2;
  end
  if y(end)^3<x(end)
      y(end+1)=sqrt(x(end));
  end
end

>> [x y] = foo
x =
     0     1     4    25   676
y =
     0     1     2     5    26

Я не говорю, что эта функция - хороший способ сделать то, что вы пытаетесь сделать, но я думаю, что это завершает работу.Если это произойдет, оставьте комментарий, и, возможно, кто-то другой сможет зайти и рассказать вам, как сделать это более эффективно / безопаснее.

Решение, которое я предоставил, будет подвержено проблемам.Если ваша переменная дважды изменяется в одном и том же цикле, хотите вы это увидеть или нет?Если вы обновите один элемент матрицы, вы хотите увидеть это или нет?Могут ли ваши переменные изменить размеры или типы в цикле?Если переменные не изменяют значения в цикле, можете ли вы включить эти значения в любом случае?

Возможно, это решение будет работать лучше для того, что вы пытаетесь сделать:

function [xout yout] = foo
n=100;
x = 0;
y = 0;
xout = repmat(x,n,1);
yout = repmat(y,n,1);
for i = 1:n
  if x<i
      x=i^2;
      end
  if y^3<x
      y=sqrt(x);
  end
    xout(i)=x;
    yout(i)=y;
end
xout = unique(xout);
yout = unique(yout);

>> [x y] = foo

x =
     1
     4
    25
   676

y =
     1
     2
     5
    26
2 голосов
/ 10 февраля 2011
function [var1 var2] = my_func
    for n=1:5
        var1(n) = 2*n - 1;
        var2(:,:,n) = rand(3);  %create random 3x3 matrices 
    end

Затем можно вызвать функцию следующим образом

>> [first second] = my_func

first =

     1     3     5     7     9


second(:,:,1) =

    0.3371    0.3112    0.6020
    0.1622    0.5285    0.2630
    0.7943    0.1656    0.6541


second(:,:,2) =

    0.6892    0.0838    0.1524
    0.7482    0.2290    0.8258
    0.4505    0.9133    0.5383


...
...