blockcopy方法3D数组

时间:2017-10-06 19:25:56

标签: c# visual-studio-2015 3d buffer

我正在开发一个项目,我需要有一个2D数组的滚动平均值。滚动平均值应该是滚动“窗口”大小为8的平均值。我在这里有一个简单的例子来说明,但是想法是每个新的2D数组(一个新的数据扫描),该数组将被复制到滚动缓冲区我已经设置为3D数组,其中第三维是滚动窗口的大小。使用下面的当前代码,我没有得到我期望的输出。为了检查它是否正常工作,我只是在滚动缓冲区的所有扫描中在每次2D扫描中打印出相同的位置,但是我没有得到我期望的内容,而且我很难在代码中找到问题。我是否正确地解决了这个问题?谢谢你的帮助。输出如下。

actual output

我希望输出看起来像: 0(下一行) 1 | 0(下一行) 2 | 1 | 0(下一行) 3 | 2 | 1 | 0(下一行) 等等...

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BlockCopySample
{
    class Program
    {

        static void Main(string[] args)
        {

            RollingAverager RA = new RollingAverager();

            for (int i = 0; i < 25; i++)
            {
                RA.addValue(i);
                RA.PrintBuffer();

                System.Threading.Thread.Sleep(1000);
            }
        }
    }



    class RollingAverager
    {
        const int INT_SIZE = 4;
        const int DOUBLE_SIZE = 8;

        const int BUFFER_LENGTH = 8;
        const int SCAN_ROW_SIZE = 3;
        const int SCAN_COLUMN_SIZE = 4;

        //int scan_value_block_size = SCAN_ROW_SIZE * SCAN_COLUMN_SIZE * DOUBLE_SIZE;
        int scan_value_block_size=0;



        double[,] array_CurrentScan = null;
        double[,,] array_FullBuffer = null;

        double total = 0;
        int numLoaded = 0;



        public double Average { get; set; }

        public RollingAverager()
        {


            array_CurrentScan = new double[SCAN_ROW_SIZE, SCAN_COLUMN_SIZE];
            array_FullBuffer = new double[SCAN_ROW_SIZE, SCAN_COLUMN_SIZE, BUFFER_LENGTH];
            scan_value_block_size = Buffer.ByteLength(array_CurrentScan);
        }

        //public void addValue(int newVal)


        public void addValue(int index)    
        {

            //Console.Write("here" + index.ToString() + "\n");

            for (int j = 0; j < SCAN_ROW_SIZE; j++)
            {
                for (int k = 0; k < SCAN_COLUMN_SIZE; k++)
                {
                    array_CurrentScan[j, k] = (double) index + j + k;
                }

            }

            //Console.Write("here 1\n");

            if (numLoaded == 0)
            {
                numLoaded++;
                Console.Write("here 2\n");
            }
            else if(numLoaded > 0 && numLoaded < BUFFER_LENGTH)
            {
                //shift all buffer scans by 1 index to allow for new data to be copied into 0 index
                Buffer.BlockCopy(array_FullBuffer, 0 * scan_value_block_size, array_FullBuffer, 1 * scan_value_block_size, numLoaded * scan_value_block_size);

                Console.Write("here 3\n");
                numLoaded++;
            }
            else
            {
                //shift all buffer scans by 1 index to allow for new data to be copied into 0 index
                Buffer.BlockCopy(array_FullBuffer, 0 * scan_value_block_size, array_FullBuffer, 1 * scan_value_block_size, (BUFFER_LENGTH - 1) * scan_value_block_size);
                Console.Write("here 4\n");
            }

            //Copy new data into buffer at index 0
            Buffer.BlockCopy(array_CurrentScan, 0 * scan_value_block_size, array_FullBuffer, 0 * scan_value_block_size, scan_value_block_size);


            //Average = total / numLoaded;
        }


        public void PrintBuffer()
        {

            //Console.Write("|");

            //Console.Write(total.ToString() + "\n");


            for (int i = 0; i < numLoaded; i++)
            {
                //total += array_FullBuffer[0,3,i];
                Console.Write(array_FullBuffer[0, 0, 0].ToString() + " | ");

            }

            Console.Write("\n");

            //Console.WriteLine("     Average = " + Average.ToString());
        }



    }

}

0 个答案:

没有答案