Я рекомендую вам создать выражение, представляющее ваши вычисления.Затем вы компилируете это выражение.
Ваше выражение будет лямбда-выражением.Пример для трех входов:
void (byte[] inputA, byte[] inputB, byte[] inputC) {
for (var i = 0; i < x; i++)
{
pixelmap[i] = (
(inputA[i]*multipliers0) +
(inputB[i]*multipliers1) +
(inputC[i]*multipliers1)
);
}
}
. Используя .NET 4, у вас есть цикл for, доступный как выражение (не в .NET 2).
Звучит сложно, но на самом деле довольно легкочтобы сделать это.
Просто чтобы уточнить: вы скомпилируете во время выполнения функцию, которая специализируется на постоянном количестве входов.
Вы можете даже играть в трюки, такие как развертывание цикла 2 или 4 раза,Вы также можете встроить множители как константы, как это было в примере.Это будет намного быстрее, чем вложенные циклы.
Обратите внимание, что цикл находится внутри дерева выражений, а не вокруг него.Это означает, что у вас есть только накладные расходы на один вызов делегата (и на результат многоразовой компиляции).
Вот пример кода, с которого можно начать:
int inputCount = ...;
var paramExpressions = GenerateArray(inputCount, i => Expression.Parameter(typeof(byte[]), "input" + i);
var summands = GenerateArray(inputCount, i => Expression.Mul(/* inputA[i] HERE */, Expression.Constant(multipliers[i]));
var sum = summands.Aggregate((a,b) => Expression.Add(a,b));
var assignment = /* assign sum to pixelmap[i] here */;
var loop = /* build a loop. ask a new question to find out how to do this, or use google */
var lambda = Expression.Lambda(paramExpressions, loop);
var delegate = lambda.Compile();
//you are done compiling. now invoke:
delegate.DynamicInvoke(arrayOfInputs); //send an object of type byte[][] into the lambda
Вот и все.Вам необходимо заполнить пробелы.