C#将数组的每一行乘以一组因子

时间:2019-05-30 19:21:09

标签: c# arrays multiplication

我有一个多维数组,我想将它的每一行乘以一个包含因子的一维数组来创建一个新的多维数组。但是,多维数组中的行数从一次运行到下一次运行将有所不同,因此我需要一种方法来遍历多维数组的每一行直到最后一行为止。

这是一个简单的例子,我有多维数组: {{1,2,3,4},{5,6,7,8},{9,10,11,12}}

,我想将每行乘以: {0.5,0.4,0,0.8}

获得: {{1 * 0.5,2 * 0.4,3 * 0,4 * 0.8},{5 * 0.5,6 * 0.4,7 * 0,8 * 0.8},{9 * 0.5,10 * 0.4,11 * 0, 12 * 0.8}}

我尝试使用示例代码在for循环中使用.Length。

double [] factors = {0.5, 0.4, 0, 0.8};

int [,] myarray = new int [3,4] {
{ 1, 2, 3, 4},
{ 5, 6, 7, 8},
{ 9, 10, 11, 12}
};

double [] output = new double[myarray.Length];
for(int i = 0; i < myarray.Length; ++i)
    output[i] = myarray[i] * factors;

我遇到语法错误,无法将扩展方法'Length'应用于int类型,并且使用[]进行索引也不能应用于int类型。

4 个答案:

答案 0 :(得分:1)

我建议使用一个破烂的数组。多维数组存在,但支持不佳,几乎没有人使用它们。如果使用锯齿状数组,则可以更加简洁。更重要的是,您可以对此有更多的 故意

double[][] myArray = getMeSomeData();
double[]   factors = getMeSomeRowFactors();

foreach (var row in myArray)
{
  MultiplyRow(row, factors)
}

. . .

void MultiplyRow( double[] row, double[] factors )
{
  for ( int col = 0 ; col < row.length ; ++col )
  {
    row[col] = row[col] * factors[col];
  }
}

甚至更好:使用Linq:

double[][] myArray = getMeSomeData();
double[]   factors = getMeSomeRowFactors();

myArray = myArray
          .Select( row => row.Select( (cell, i) => cell * factors[i] ).ToArray() )
          .ToArray()
          ;

甚至[可以说]更好;

double[][] myArray = getMeSomeData();
double[]   factors = getMeSomeRowFactors();

myArray = myArray
          .Select( Multiply(factors) )
          .ToArray()
          ;

. . .
Func<double,int,double[]> Multiply( double[] factors )
{
  return (cell, i) => cell * factors[i];
}

答案 1 :(得分:0)

double[] factors = { 0.5, 0.4, 0, 0.8 };

int[,] myarray = new int[3, 4] 
{
    { 1, 2, 3, 4},
    { 5, 6, 7, 8},
    { 9, 10, 11, 12}
};

int index = 0;
double[] output = new double[myarray.Length];

for (int a = 0; a < myarray.GetLength(0); a++)
{
    for (int b = 0; b < myarray.GetLength(1) && index < output.Length; b++)
    {
        output[index] = myarray[a, b] * factors[b];
        index++;
    }
}

Console.WriteLine(string.Join(", ", output));

答案 2 :(得分:0)

我不确定您是否认为它有用,但是可以使用 MathNet.Numerics

  

PM>安装软件包MathNet.Numerics

CREATE PROCEDURE [dbo].[spFlugReport]     
(      
   @AccNo INTEGER,
   @DateFrom DATE, 
   @DateTo DATE    
)      
AS
BEGIN
    SELECT * 
    FROM [dbo].[KIRData] 
    WHERE AccNo = @AccNo 
      AND StartDate >= @DateFrom 
      AND EndDate <= @DateTo 
      AND Prod = 'Air'
END

答案 3 :(得分:0)

您可以使用方法GetLength获取每个尺寸的长度:

double[,] output = new double[myarray.GetLength(0), myarray.GetLength(1)];
for (int i = 0; i < myarray.GetLength(0); i++)
{
    for (int j = 0; j < myarray.GetLength(1); j++)
    {
        output[i, j] = myarray[i, j] * factors[j];
    }
}

如果阵列很大,则可以使用PC的所有处理器/核心来加快计算速度:

Parallel.For(0, myarray.GetLength(0), i =>
{
    for (int j = 0; j < myarray.GetLength(1); j++)
    {
        output[i, j] = myarray[i, j] * factors[j];
    }
});