Я хочу рассчитать на двух массивах что-то вроде операции умножения, деления, плюс-минус или синуса (array1 (i) + array2 (i)) и т.д....
в matlab это очень легко.
например: t1
, t2
и t3
- массивы:
t1=0:1:100;
t2=0:1:100;
t3 = t1.*t2; // the multiplication. that all in matlab! t3 will be 1, 4, 9, 16, ....... , 100000.
или другой, t3 = sin( pi*t1 )/t2
; // и т.д..
что, если я хочу много работать над массивом, мне нужно постоянно писать код для всех операций, таких как этот код:
Double[] Result_Array = multiplication(array1,array2);
double[] multiplication(double[] array1, double[] array2)
{
double[] result = new double[array1.Length];
for (int i = 0; i < array1.Length; i++)
{
result[i] = array1[i] * array2[i];
}
return result;
}
Как я могу сделать синус, косинус, минус, плюс, деление, минус и деления... бесконечные математические ситуации с одной функцией?
заранее спасибо
Вы можете использовать System.Linq
public TEntity[] Compute<TEntity>(TEntity[] array, Func<TEntity, TEntity> operation)
{
return array.Select(operation).ToArray();
}
public TEntity[] Compute<TEntity>(TEntity[] array1, TEntity[] array2, Func<TEntity, TEntity, TEntity> operation)
{
if (array1.Length != array2.Length)
throw new ArgumentException();
return array1.Zip(array2, operation).ToArray();
// return Enumerable.Range(0, array1.Length).Select(index => operation(array1[index], array2[index])).ToArray();
}
И используйте вот так:
double[] result1 = Compute(array1, Math.Cos);
double[] result2 = Compute(array1, array2, Math.Log);
double[] result3 = Compute(array1, array2, (value1, value2) => value1 * value2);
Вам понадобится функция, которая применяет делегат (ссылку на функцию, которая работает с одним double
или двумя double
аргументами) для каждого элемента или каждой пары элементов из одного/двух массивов одного измерения.
Например:
delegate double UnaryOp(double x);
double[] array_unary_op(double[] arr, UnaryOp op)
{
double[] result = new double[arr.Length];
for (int i = 0; i < arr.Length; i++)
{
result[i] = op(arr[i]);
}
return result;
}
с вызовом в строках apply_unary_op(somearray, Math.Tan)
или apply_unary_op(somearray, Math.Exp)
Не уверен, что это то, что вы ищете, но вы можете использовать .Zip
вместо этого и предоставить любую функцию result
вы хотите:
double[] result = array1.Zip(array2, (first, second) => first * second).ToArray();
Или используя второй пример:
double[] result =
array1.Zip(array2, (first, second) => Math.Sin(Math.PI * first) / second).ToArray();