コード例 #1
0
ファイル: SpectraResult.cs プロジェクト: wo80/csparse-interop
        /// <inheritdoc />
        protected override DenseColumnMajorStorage <Complex> CreateEigenVectorsMatrix()
        {
            // Number of requested eigenvalues.
            int k = this.Count;

            // Matrix with k columns of complex eigenvectors.
            var result = new CSparse.Complex.DenseMatrix(size, k);

            var values = result.Values;

            // Raw eigenvector storage.
            var rp = (double[])eigvec;

            if (symmetric)
            {
                for (int i = 0; i < k; i++)
                {
                    int column = i * size;

                    for (int j = 0; j < size; j++)
                    {
                        values[column + j] = rp[column + j];
                    }
                }

                return(result);
            }

            for (int i = 0; i < k; i++)
            {
                int current = i * size; // Current column offset.

                for (int j = 0; j < size; j++)
                {
                    values[current + j] = new Complex(rp[2 * (current + j)], rp[2 * (current + j) + 1]);
                }
            }

            return(result);
        }
コード例 #2
0
ファイル: ArpackResult.cs プロジェクト: wo80/csparse-interop
        /// <inheritdoc />
        protected override Matrix <Complex> CreateEigenVectorsMatrix()
        {
            // Number of requested eigenvalues.
            int k = this.Count;

            // Matrix with k columns of complex eigenvectors.
            var result = new CSparse.Complex.DenseMatrix(size, k);

            var values = result.Values;

            // Raw eigenvector storage.
            var rp = (double[])eigvec;

            if (symmetric)
            {
                for (int i = 0; i < k; i++)
                {
                    int column = i * size;

                    for (int j = 0; j < size; j++)
                    {
                        values[column + j] = rp[column + j];
                    }
                }

                return(result);
            }

            // Imaginary part of eigenvalues.
            var eim = (double[])eigvali;

            int length = values.Length;

            for (int i = 0; i < k; i++)
            {
                int current = i * size; // Current column offset.

                if (eim[i] == 0.0)
                {
                    for (int j = 0; j < size; j++)
                    {
                        values[current + j] = rp[current + j];
                    }
                }
                else
                {
                    int next = (i + 1) * size; // Next column.

                    for (int j = 0; j < size; j++)
                    {
                        var a = new Complex(rp[current + j], rp[next + j]);

                        values[current + j] = a;

                        // Check if next column is available (alternatively, allocate space for
                        // one additional column, see CreateWorkspace() method below).
                        if (next < length)
                        {
                            values[next + j] = Complex.Conjugate(a);
                        }
                    }

                    i++;
                }
            }

            return(result);
        }