C # процесс расчета на массивах, как в Matlab

1

Я хочу рассчитать на двух массивах что-то вроде операции умножения, деления, плюс-минус или синуса (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;
 }

Как я могу сделать синус, косинус, минус, плюс, деление, минус и деления... бесконечные математические ситуации с одной функцией?
заранее спасибо

Теги:
arrays
math
discrete-mathematics

3 ответа

0
Лучший ответ

Вы можете использовать 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);
  • 0
    это работает отлично. Это кажется мне сложным. (У меня меньше знаний о linq) Но я думаю, что это лучший ответ.
0

Вам понадобится функция, которая применяет делегат (ссылку на функцию, которая работает с одним 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)

  • 0
    Можете ли вы привести маленький пример, пожалуйста?
0

Не уверен, что это то, что вы ищете, но вы можете использовать .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();
  • 0
    Это работа для меня. Но мне нужно использовать как: Double [] result = array1.Zip (array2, (first, second) => first * second); Есть ли способ преобразовать тип var в тип массива Double []?
  • 0
    @ Али КАКИЛ: Конечно, смотрите обновление

Ещё вопросы

Сообщество Overcoder
Наверх
Меню