Отдельные подмножества из набора - PullRequest
0 голосов
/ 01 июня 2011

Я написал метод расширения, который возвращает мне 2-мерный массив значений YUV из растрового изображения, т.е.

public static YUV[,] ToYuvLattice(this System.Drawing.Bitmap bm)
{
    var lattice = new YUV[bm.Width, bm.Height];
    for(var ix = 0; ix < bm.Width; ix++)
    {
        for(var iy = 0; iy < bm.Height; iy++)
        {
            lattice[ix, iy] = bm.GetPixel(ix, iy).ToYUV();
        }
    }
    return lattice;
}

Затем мне нужно извлечь наборы с одинаковыми компонентами U и V. То есть Set1 содержит все пары [item1; item2], пары Set2 conatains [_item1; _item2]. Поэтому я хочу получить список списков.

public IEnumerable<List<Cell<YUV>>> ExtractClusters()
{            
    foreach(var cell in this.lattice)
    {
        if(cell.Feature.U != 0 || cell.Feature.V != 0)
        {
            // other condition to be defined
        }
        // null yet
        yield return null;
    }
} 

Я начал с вышеприведенного кода, но придерживался условия для различных значений.

1 Ответ

1 голос
/ 01 июня 2011

Похоже, у вас есть отношение эквивалентности, и вы хотите разделить данные. Под отношением эквивалентности я имею в виду:

  1. A r A
  2. A r B => B r A
  3. A r B и B r C => A r C

Если это то, что у вас есть, то это должно сработать.

public static class PartitionExtension
{
    static IEnumerable<List<T>> Partition<T>(this IEnumerable<T> source, Func<T, T, bool> equivalenceRelation)
    {
        var result = new List<List<T>>();
        foreach (var x in source)
        {
            List<T> partition = result.FirstOrDefault(p => equivalenceRelation(p[0], x));
            if (partition == null)
            {
                partition = new List<T>();
                result.Add(partition);
            }

            partition.Add(x);
        }
        return result;
    }
}

Использование:

return this.lattice
.Where( c=> c.Feature.U != 0 && c.Feature.V != 0 )
.Partition((x,y)=>
     x.Feature.U == y.Feature.U &&
     x.Feature.V == y.Feature.V);
...