2016-07-01 2 views
0

Есть ли способ иметь одну функцию, которая может возвращать две разные переменные, но только по одному и знать, какой из них возвращается в вызове функции?Функция с различными возвращаемыми переменными

пример: У меня есть следующие функции, в которых только один из выходов является действительным (другой будет [])

function [a,b] = AlternatingOutput (input) 
    if input == 1 
     return ONLY A 
    else 
     return ONLY B 
    end 
end 

и я называем это в сценарии

[a,b] = AlternatingOutput (input) 

я хочу способ сказать следующее (псевдокод):

if (function outputs a) 
    [a,~] = AlternatingOutput(input) 
elseif (function outputs b) 
    [~,b] = AlternatingOutput(input) 
end 

сценарий работать в цикле, а потом мне нужно новое Допустимых значения а и Ь, поэтому я не могу переписать один из двух с []

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

Я надеюсь, что я сделал мой вопрос ясен, и я надеюсь, что кто-то может мне ответить :)

+2

Всегда возвращать два значения, но использовать [значение дозорного] (http://stackoverflow.com/questions/22103552/how-to-make-a-sentinel- value-in-matlab) для r "не возвращено". Получите возвращаемые значения 'AlternatingOutput' для имен temp:' [ax, bx] = AlternatingOutput (input) 'и переназначьте их только тогда, когда возвращаемое значение не является дозорным (' if ax ~ = sentinel a = ax; end'. Или пересмотреть функции ввода/вывода, он честно пахнет плохим дизайном. –

+2

просто поместил флаг вместо второго выхода, если флаг равен 1 выходу == a если флаг равен 0 output b – Umar

+0

О, и '[]' может использоваться как контрольный стоимость. –

ответ

4

Там нет никакого способа узнать, есть ли выход аргумент фактически используется. Вы можете проверить количество выходных аргументов, используя nargout и это позволило бы провести различие между [a] = AlternatingOutput(input) и [~,b] = AlternatingOutput(input)

Я не знаю полный контекст вашей проблемы, но, возможно, вы можете поместить все переменные в структуры? Просто передайте эту структуру каждый раз, когда вы вызываете функцию и позволяете ей решать, какие переменные нужно манипулировать. (Это может быть медленным в некоторых языках программирования, но не в Matlab).

0

Как насчет перенастройки ячейки?

function [ ab ] = testfun(input) 
if input 
    ab={'ax'}; 
else 
    ab={2}; 
end 
end 

Не беспокойтесь о том, что находится в камере.

бат вы можете вернуть то, что вы хотите, Matlab не проверяет тип в любом случае

0

Если только один из выходов из функции AlternatingOutput действует, то вам нужно только вернуть один выход:

function [X] = AlternatingOutput(input) 
    if input == 1 
     X = A; 
    else 
     X = B; 
    end 
end 

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

C = {AlternatingOutput(1), AlternatingOutput(2)}; 

, а затем использовать вход, чтобы определить, какое значение изменения.Если вход либо 1 или 2, вы можете просто сделать

for counter = ... 
    input = mod(input,2)+1; 
    C{input}=AlternatingOutput(input); 
end 
0

Если функция не возражает против принятия более входных переменных, то почему бы не передать a и b в качестве входных данных:

function [a,b] = AlternatingOutput(a,b,input) 
    if input == 1 
     a = new_value_for_a; 
     % b retains its former value 
    else 
     % a retains its former value 
     b = new_value_for_b; 
    end 
end 

Тогда это может быть легко вызывается из вашего скрипта в цикле:

for i= ... 
    [a,b] = AlternatingOutput(a,b,input); 
    ... 
    ... 
end 
Смежные вопросы