动态加载多维数组

时间:2017-10-02 01:02:51

标签: c# arrays

我有以下代码。它在概念上与python reshape函数大致类似。它成功地将1维数据加载到多维数组中,其维度直到运行时才知道。例如{209,64,64,3}。我必须遍历1维数据并为数组的每个维度创建正确的索引。

private void InitializeData()
{
  var imageData = ImageData.Load(txtFileName.Text); // one dimensional array
  var dimensions = txtDimensions.Text.Split(',').Select(d => int.Parse(d)).ToArray(); // e.g., {-1,64,64,3}
  int elements = 1;
  foreach (var dim in dimensions.Skip(1))
  {
    elements *= dim;
  }
  dimensions[0] = imageData.Length / elements; // {209,64,64,3}
  // create multipliers
  var multipliers = new int[dimensions.Length - 1];
  for (var dimension = 1; dimension < dimensions.Length; dimension++)
  {
    var multiplier = 1;
    for (var followingdimension = dimension; followingdimension < dimensions.Length; followingdimension++)
    {
      multiplier *= dimensions[followingdimension];
    }
    multipliers[dimension - 1] = multiplier;
  }
  // load data
  var dataArray = Array.CreateInstance(typeof(int), dimensions);
  var indexes = new int[dimensions.Length];
  for (var imageDataIndex = 0; imageDataIndex < imageData.Length; imageDataIndex++)
  {
    indexes[0] = imageDataIndex / multipliers[0];
    indexes[dimensions.Length - 1] = imageDataIndex % multipliers[multipliers.Length - 1];
    for (var multiplier = 1; multiplier < dimensions.Length - 1; multiplier++)
      indexes[multiplier] = (imageDataIndex / multipliers[multiplier]) % dimensions[multiplier];
    dataArray.SetValue(imageData[imageDataIndex], indexes);
  }
}

有更快或更优雅的方式吗?我确实认识到这是两件不同的事情。我会在优雅的建议上做标记,但我仍然希望看到它们。因为这看起来太难看了,写起来太痛苦了,不是最好的方式。

注意(请)

数据可能并不总是图像数据,所以我不是在寻找位图操作。这只是发生在这里,但它不一定是典型的情况。并且,我的目标不是获取位图,而是获取数组。

1 个答案:

答案 0 :(得分:0)

感谢How to reshape an Array in c#

,我得到了部分答案

代码可以替换为:

id:"1" OR id:"2"

如果有更快的方式来实现 var imageData = ImageData.Load(txtFileName.Text); // one dimensional array // e.g., {209,64,64,3} var dimensions = txtDimensions.Text.Split(',').Select(d => int.Parse(d)).ToArray(); int elements = 1; foreach (var dim in dimensions.Skip(1)) { elements *= dim; } dimensions[0] = imageData.Length / elements; // load data var dataArray = Array.CreateInstance(typeof(int), dimensions); Buffer.BlockCopy(imageData, 0, dataArray, 0, imageData.Length * sizeof(int)); 或更简单的实际负载,我会感到惊讶。结果表明原始数据所处的维度形式,只要您可以将目标维度指定为目标数组的一部分,Buffer.BlockCopy就会处理它。

我会继续寻找进一步完善其余原始代码的方法。