2014-11-13 5 views
2

Рассмотрим вектор-значений функции foo(),Назначение результата векторнозначной MATLAB функции в цикле

function [x, y] = foo() 
x = exp(0); 
y = exp(1); 
end 

и сценарий, который вызывает foo() в общей сложности N раз,

N=5; 
Results = zeros(N,2); 

for i=1:N 
    Results(i,:) = foo(); 
end 

Желаемое содержание: Results:

1 2.7183 
1 2.7183 
1 2.7183 
1 2.7183 
1 2.7183 

Фактическое содержание Results:

1 1 
1 1 
1 1 
1 1 
1 1 

есть простой исправить это? Благодаря!

+0

Я думаю, что 'x = [exp (0) exp (1)]' внутри этой функции, и вы можете избежать использования 'y' в нем, но должны работать, даже если вы решили сохранить его. Кстати, чтобы получить 'Результаты' непосредственно без петель -' Результаты = repmat ([exp (0) exp (1)], N, 1) '. – Divakar

+0

Да, Дивакар верен. 'foo' - это функция с двумя выходами, но даже если у вас есть вектор 1x2 слева от' = ', Matlab рассматривает его как одну переменную и поэтому выбрасывает второй вывод' foo'. Другим способом решения проблемы является выполнение «[Результаты (i, 1), Результаты (i, 2)] = foo()', что, конечно, не так чисто. – David

ответ

4

Ваша функция foo работает нормально. Однако в цикле вывод foo присваивается только одной переменной, хотя вы пытаетесь поместить оба значения из foo в строку в своей матрице. Это техничность с MATLAB, которая может показаться раздражающей вначале. Он обрабатывает всю строку вашей матрицы как одну переменную, поэтому мы получаем только первую переменную от foo. Вторая переменная отбрасывается. Поскольку он возвращает только одну переменную, ваше назначение в вашем цикле на каждой итерации присваивает целой строке одинаковое число, что является первым выходом foo.

Есть три способа, которые вы можете получить эту работу:

1. Измените вашу foo функции (а-ля Divakar)

Если вы хотите произвести вектор выходов быть назначены матрицы, вам нужно вернуть одну переменную и объединить оба значения exp(0) и exp(1) на выход. Таким образом:

function x = foo() 
x = [exp(0) exp(1)]; 
end 

Затем вы можете использовать код цикла.

2. Используйте временные переменные в цикле

Вы можете оставить foo нетронутыми, но вы должны получить оба выходных переменных из foo первой, а затем назначить его на матрицу. Таким образом:

N=5; 
Results = zeros(N,2); 

for i=1:N 
    [x, y] = foo(); 
    Results(i,:) = [x, y]; 
end 

3. Изменение, как вы пишете Results (а-ля Дэвид)

Вы можете избавиться от временных переменных, изменяя, как вы звоните foo. Вам нужно будет проиндексировать в Results самостоятельно, чтобы получить доступ к каждому значению с вывода foo в вашем запросе.Поэтому:

N=5; 
Results = zeros(N,2); 

for i=1:N 
    [Results(i,1), Results(i,2)] = foo(); 
end 

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

0

Когда вы определяете function [x,y] = foo(), эту функцию следует называть [x,y]=foo(), или в вашем случае [Results(i,1), Results(i,2)]=foo().

Если вы сделаете Results(i,:)=foo(), он вернет только первый аргумент foo(), который равен 1,0, и транслируется до Results(i,:).