0

始める前に、私が初心者開発者であることをお詫び申し上げます。

私が欲しいのは、データを含むグリッドです。7 つのポイント (x、y、値) を持つ配列のリストを持っているのは私だけです。これを 5x5 のグリッドで実行したいと考えています。私だけが多くの価値観を見逃しています。補間関数を使用して欠損値を生成したい。多次元 (または補間) (x, y) を検索して他のグリッドの値を生成するアルゴリズム。

グリッドの例:

18 - 0 - 0 - 35 - 0
0 - 20 - 0 - 0 - 29
25 - 0 - 0 - 30 - 0
0 - 25 - 0 - 32 - 35
0 - 0 - 28 - 0 - 0

私はメソッドを使用しました(数値メソッド、アルゴリズム、およびC#ブックのツールから)、それは機能していますが、値を関数に渡し、ランダムな5x5欠損値を生成する方法がわかりません.本で説明されています。

zdata[,] double 2D 配列とは何ですか?、これは点からの値ですか? xdate と ydata とは何ですか?

例、7 つの点 (x,y,value)=> 0,0,18 などの配列があります。このメソッドに正しく渡して欠損値を生成するにはどうすればよいですか?

関数全体は次のとおりです。

class InterpolationTest
{
    static void Main(string[] args)
    {
        double[] xdata = new double[] { 0, 2 };  //x-coordinate 0 and 2?
        double[] ydata = new double[] { 0, 2 };  //y-coordinate 0 and 2?
        double[,] zdata = new double[,] { { 0, 20 }, { 20, 10 } }; //what is a zdata??
        double[] x = new double[5]; 
        double[] y = new double[5];
        RMatrix z = new RMatrix(5, 5);
        for (int i = 0; i < 4; i++)
        {
            x[i] = (i + 2.0) / 20.0;
            y[i] = (i + 2.0) / 20.0;
        }
        RVector xvec = new RVector(x);
        RVector yvec = new RVector(y);
        for (int i = 0; i < 5; i++)
        {
            for (int j = 0; j < 5; j++)
            {
                z[i, j] = BilinearInterpolation(xdata, ydata, zdata, x[i], y[j]);
            }
        }
        Console.Clear();
        Console.WriteLine("Running Bilinear Interpolation Test\n\n");
        Console.WriteLine("x = " + xvec.ToString());
        Console.WriteLine("y = " + yvec.ToString());
        Console.WriteLine("\nResults z = \n" + z.ToString() + "\n\n");
        Console.WriteLine("Press ENTER key to continue...");
        Console.ReadLine();

    }

    public static double BilinearInterpolation(double[] x, double[] y, double[,] z, double xval, double yval)
    {
        double zval = 0.0;
        for (int i = 0; i < x.Length - 1; i++)
        {
            for (int j = 0; j < y.Length - 1; j++)
            {
                if (xval >= x[i] && xval < x[i + 1] && yval >= y[j] && yval < y[j + 1])
                {
                    zval = z[i, j] * (x[i + 1] - xval) * (y[j + 1] - yval) / (x[i + 1] - x[i]) / (y[j + 1] - y[j]) +
                    z[i + 1, j] * (xval - x[i]) * (y[j + 1] - yval) / (x[i + 1] - x[i]) / (y[j + 1] - y[j]) +
                    z[i, j + 1] * (x[i + 1] - xval) * (yval - y[j]) / (x[i + 1] - x[i]) / (y[j + 1] - y[j]) +
                    z[i + 1, j + 1] * (xval - x[i]) * (yval - y[j]) / (x[i + 1] - x[i]) / (y[j + 1] - y[j]);
                }
            }
        }
        return zval;
    }

    public static double[] BilinearInterpolation(double[] x, double[] y, double[,] z, double[] xvals, double[] yvals)
    {
        double[] zvals = new double[xvals.Length];
        for (int i = 0; i < xvals.Length; i++)
            zvals[i] = BilinearInterpolation(x, y, z, xvals[i], yvals[i]);
        return zvals;
    }
}

public struct RMatrix
{
    private int nRows;
    private int nCols;
    private double[,] matrix;

    public RMatrix(int nCols, int nRows)
    {
        this.nRows = nRows;
        this.nCols = nCols;
        this.matrix = new double[nRows, nCols];
        for (int i = 0; i < nRows; i++)
        {
            for (int j = 0; j < nCols; j++)
            {
                matrix[i, j] = 0.0;
            }
        }
    }

    public RMatrix(double[,] matrix)
    {
        this.nRows = matrix.GetLength(0);
        this.nCols = matrix.GetLength(1);
        this.matrix = matrix;
    }

    public RMatrix(RMatrix m)
    {
        nRows = m.GetnRows;
        nCols = m.GetnCols;
        matrix = m.matrix;
    }

    public RMatrix IdentityMatrix()
    {
        RMatrix m = new RMatrix(nRows, nCols);
        for (int i = 0; i < nRows; i++)
        {
            for (int j = 0; j < nCols; j++)
            {
                if (i == j)
                {
                    m[i, j] = 1;
                }
            }
        }
        return m;
    }

    public int GetnRows
    {
        get { return nRows; }
    }
    public int GetnCols
    {
        get { return nCols; }
    }

    public override string ToString()
    {
        string strMatrix = "(";
        for (int i = 0; i < nRows; i++)
        {
            string str = "";
            for (int j = 0; j < nCols - 1; j++)
            {
                str += matrix[i, j].ToString() + ", ";
            }
            str += matrix[i, nCols - 1].ToString();
            if (i != nRows - 1 && i == 0)
                strMatrix += str + "\n";
            else if (i != nRows - 1 && i != 0)
                strMatrix += " " + str + "\n";
            else
                strMatrix += " " + str + ")";
        }
        return strMatrix;
    }
}

public struct RVector
{
    private int ndim;
    private double[] vector;

    public RVector(int ndim)
    {
        this.ndim = ndim;
        this.vector = new double[ndim];
        for (int i = 0; i < ndim; i++)
        {
            vector[i] = 0.0;
        }
    }

    public RVector(double[] vector)
    {
        this.ndim = vector.Length;
        this.vector = vector;
    }

    public override string ToString()
    {
        string str = "(";
        for (int i = 0; i < ndim - 1; i++)
        {
            str += vector[i].ToString() + ", ";
        }
        str += vector[ndim - 1].ToString() + ")";
        return str;
    }
}

ありがとう

4

0 に答える 0