示例#1
0
 private void RefreshFibonacci()
 {
     CmbBoxFibonacci.Items.Clear();
     if (ImgCoverImage.Image.Width > 0 && ImgCoverImage.Image.Width == ImgCoverImage.Image.Height)
     {
         var        fibSequence = FibonacciSequence.UsableSequences(ImgCoverImage.Image.Width);
         List <int> filteredFib = new List <int>(fibSequence);
         if (_coverImage.Width > 7)
         {
             filteredFib = fibSequence.Select(x => x).Where(x => x < _coverImage.Width - (int)Math.Pow(2, (int)Math.Log(_coverImage.Width, 2) - 2)).ToList();
         }
         for (int i = 0; i < filteredFib.Count; i++)
         {
             CmbBoxFibonacci.Items.Add(filteredFib[i]);
         }
         CmbBoxFibonacci.SelectedIndex = 0;
     }
 }
示例#2
0
        protected virtual void Initialize(int p, int N, double alpha)
        {
            _fibonacciSequence = FibonacciSequence.GetSequence(p, N);
            this.alpha         = alpha;

            var cacheMatrices = Cache.TryGetFHTMatrix(new Tuple <int, int>(p, N));

            if (cacheMatrices != null)
            {
                _fhtMatrix        = cacheMatrices.Item1;
                _fhtMatrixInverse = cacheMatrices.Item2;
            }
            else
            {
                _fhtMatrix        = FibonacciHaarTransformationMatrix(p, N);
                _fhtMatrixInverse = new SparseMatrix(_fhtMatrix.RowCount);
                _fhtMatrix.Transpose(_fhtMatrixInverse);
                _fhtMatrix.Multiply(0.5, _fhtMatrix);

                Cache.AddFHTMatrix(new Tuple <int, int>(p, N), new Tuple <Matrix, Matrix>(_fhtMatrix, _fhtMatrixInverse));
            }
        }
示例#3
0
        /// <summary>
        /// Populates the FHT matrix according to reccurent formulae and returns it as MathNet SparseMatrix
        /// </summary>
        /// <param name="p">p-sequence to use</param>
        /// <param name="N">Matrix dimension</param>
        /// <returns></returns>
        protected static Matrix FibonacciHaarTransformationMatrix(int p, int N)
        {
            double[,] pnMatrix  = { { Math.Sqrt(2) } };
            double[,] pp1Matrix = { { 1, 1 }, { 1, -1 } };
            var fibonacci = FibonacciSequence.GetSequence(p, N);
            var n         = fibonacci.IndexOfElement(N);

            double[,] pprev, prev, current = new double[0, 0];

            Queue <double[, ]> intermediate = new Queue <double[, ]>();

            for (int i = 0; i <= p; i++)
            {
                intermediate.Enqueue(pnMatrix);
            }
            intermediate.Enqueue(pp1Matrix);

            for (int i = p + 2; i <= n; i++)
            {
                int size   = fibonacci.GetElementByIndex(i);
                int pSize  = fibonacci.GetElementByIndex(i - 1);
                int ppSize = fibonacci.GetElementByIndex(i - p - 1);

                int pUpperSize = fibonacci.GetElementByIndex(i - 2);
                int pLowerSize = fibonacci.GetElementByIndex(i - p - 2);

                int ppUpperSize = pLowerSize;
                int ppLowerSize = fibonacci.GetElementByIndex(i - 2 * p - 2);

                prev    = intermediate.Last();
                pprev   = intermediate.ElementAt(intermediate.Count - p - 1);
                current = new double[size, size];

                for (int j = 0; j < pUpperSize; j++)
                {
                    for (int k = 0; k < pSize; k++)
                    {
                        current[j, k] = prev[j, k];
                    }
                }

                for (int j = pUpperSize; j < pSize; j++)
                {
                    for (int k = 0; k < pSize; k++)
                    {
                        current[j + pLowerSize, k] = prev[j, k];
                    }
                }

                for (int j = 0; j < ppUpperSize; j++)
                {
                    for (int k = 0; k < ppSize; k++)
                    {
                        current[j + pUpperSize, k + pSize] = pprev[j, k];
                    }
                }

                for (int j = ppUpperSize; j < ppSize; j++)
                {
                    for (int k = 0; k < ppSize; k++)
                    {
                        current[j + pSize, k + pSize] = pprev[j, k];
                    }
                }

                intermediate.Enqueue(current);
                intermediate.Dequeue();
            }

            return(SparseMatrix.OfArray(current));
        }
示例#4
0
 public InformedSVD(int p, int N)
 {
     _fibonacciSequence = FibonacciSequence.GetSequence(p, N);
 }
示例#5
0
 public BlindDCT(int p, int N)
 {
     _fibonacciSequence = FibonacciSequence.GetSequence(p, N);
 }