2016-02-09 2 views
0

У меня есть обертка функций, которая определена ниже: Здесь я передаю набор коэффициентов (inputArr) и кортеж, содержащий 2 двойных массива.Назначение параметров для элементов массива с индексом C#

Ожидаемый результат: сколько раз «WminObjectivefunction» наречется, а также вернуть «FuncValue», которая в основном «WminObjectivefunction» оценивается в «inputArr». Каждый раз, когда я звоню «WrapFunction« массив »inputArr« пройдены должны быть разными.

public void WrapFunction(out int ncalls, out double FuncValue, double[] inputArr, Tuple<List<double>, List<double>> arguments) 
{ 
    int calls = 0;//Number_of_FunctionEvaluations 
    // MASTER class instance 
    Master prismpy = new Master(); 
    calls += 1;//Number_of_FunctionEvaluations_Increment 
    ncalls = calls;//Return_Number_of_FunctionEvaluations 
    FuncValue = prismpy.WminObjectivefunction(inputArr, arguments.Item1, arguments.Item2);//Return_FunctionValuation 
} 

Question1: Я хочу, чтобы сохранить FuncValue в качестве элементов в массиве FSIM, Как я могу командовать WrapFunction для сохранения значения в качестве элемента массива обозначается индексом. Следующее, что я пробовал, и ошибка: Не удается неявно преобразовать «пустота» в «двойной»

// FSIM: put array in array of arrays 
double[] fsim = new double[5]; 
int fcall; 
fsim[0] = WrapFunction(out fcall, out fsim[0], _x0, args); 

Вопрос2: Нужно ли называть WrapFunction со всеми из аргументов каждый раз? Есть ли способ, если я просто хочу получить либо один из этих двух выходов?

+1

Не 'ncalls' всегда будет 1? В этом случае единственной полезной информацией является 'FuncValue', и вы можете просто вернуть ее вместо использования параметра' out'. – juharr

+0

Это огромный запах кода –

ответ

1

Не уверен, что вы имеете в виду, но я думаю так:

public double WrapFunction(out int ncalls, out double FuncValue, double[] inputArr, Tuple<List<double>, List<double>> arguments) 
{ 
    int calls = 0;//Number_of_FunctionEvaluations 
    // MASTER class instance 
    Master prismpy = new Master(); 
    calls += 1;//Number_of_FunctionEvaluations_Increment 
    ncalls = calls;//Return_Number_of_FunctionEvaluations 
    FuncValue = prismpy.WminObjectivefunction(inputArr, arguments.Item1, arguments.Item2);//Return_FunctionValuation 
    return FuncValue; 
    // NOTE: the FuncValue parameter may be redundant -- RBarryYoung 
} 

Вот еще один вариант, который отражает некоторые комментарии/обсуждения:

int calls = 0;//Number_of_FunctionEvaluations 

public double WrapFunction(out int ncalls, double[] inputArr, Tuple<List<double>, List<double>> arguments) 
{ 
    // MASTER class instance 
    Master prismpy = new Master(); 
    calls += 1;//Number_of_FunctionEvaluations_Increment 
    ncalls = calls;//Return_Number_of_FunctionEvaluations 
    return prismpy.WminObjectivefunction(inputArr, arguments.Item1, arguments.Item2);//Return_FunctionValuation 
} 
+1

В этом случае вы можете удалить 'out double FuncValue'. – juharr

+0

@juharr Правда, но требования OP кажутся расплывчатыми и, как будто они являются частью более крупного контекста, поэтому я решил не менять интерфейс. Я изменю его, чтобы установить 'FuncValue'. – RBarryYoung

+0

Ах, да, как я могу проверить, сколько раз вызывается функция Wrap? В данном случае, как сказал @juharr, его будет 1 всегда. –