具有全息子结构的矩阵的“矩阵分解”

时间:2010-09-13 21:29:07

标签: c# c++ python

在开始之前,我必须说对于具有线性代数背景的人来说,这不是矩阵分解,因为你知道它。请阅读以下段落,以便更清楚地了解我要解决的问题。

以下是矩阵及其子矩阵的显着属性/定义:

  1. 我有一个SxP矩阵,形成S.P“盒子”的网格状结构。这是主矩阵
  2. 这是(空)主矩阵的样子。矩阵中的每个方块简称为方框。矩阵可以被视为一种“游戏板”,例如国际象棋棋盘。使用间隔标度(即实数)测量垂直轴,使用单调增加的非负整数测量水平轴。

    An empty matrix

    1. 还有一个子矩阵的附加概念(如前所述)。子矩阵只是特定配置中的框的集合,并且具有分配给框的特定数字和片段类型(参见下面的黑色和白色片段)。我有一组有限的子矩阵 - 我称之为我的lexicon或词汇表来执行有效的矩阵组合/分解。
    2. 子矩阵的“形式”定义是它是主矩阵中包含的M个盒子的配置,满足标准:

      • 1 <= M <= 4
      • 任意两个相邻框之间的“间隙”G(即距离)满足:1 <= G <= 2 *(垂直单位)。

      垂直单位是主矩阵中垂直轴线之间的间隙。在下图中,垂直单位为100。

      simple submatrix addition

      上面的图像说明了一个简单的子矩阵加法。带有橙色寄宿生/盒子的单位是子矩阵 - 构成我词汇的一部分的公认单位。您会注意到我在子矩阵中引入了更多注释。这是因为(使用国际象棋类比),我有两种类型的棋子可以在棋盘上使用。 B 表示黑色部分, W (图中未显示)表示白色部分。公认的单位(或词汇/子矩阵)有一个简单的等价关系,允许白件和黑件之间的转换。该关系可用于进一步分解子矩阵以仅使用黑色片,白色片或两者的组合。

      为简单起见,我省略了指定等价关系。但是,如果有人认为所提出的问题并非“太难”而没有其他细节,我很乐意扩大范围。就目前而言,我正在努力使事情变得尽可能简单,以避免让人们混淆“信息过载”。

      1. 子矩阵中的每个框都包含一个有符号整数,表示项目的单位数。盒子的每个“配置”(连同其带符号整数和片段类型,即黑色或白色片段)被称为“识别单元”。

      2. 子矩阵可以以重叠的方式放置在主矩阵中。无论“框”重叠在哪里,结果子矩阵框中的单位数就是组成框中单位数的总和(如上图第二幅图所示)。

      3. 问题变得有点困难,因为上面定义的“认可单位”有时与其他“认可单位”组合形成另一个“认可单位” - 即子矩阵(即已识别单位)为"holons" 。例如,在上面的第二图像中,被添加到矩阵中的识别单元本身可以进一步分解为“较小”子矩阵。

        这种holarchy类似于(在物理化学中)元素形成化合物,然后形成更复杂的化合物(氨基酸,蛋白质等)。

        回到我们的问题,给定一个主矩阵M,我希望能够做到以下几点:

        我。识别主矩阵中包含的子矩阵(或已识别的单元)。这是第一个“矩阵分解”。 (注意:子矩阵必须满足上面给出的标准)

        II。对于每个识别的子矩阵,我希望能够识别它是否可以进一步分解为2个或更多个已识别的子矩阵。我们的想法是迭代地分解上面步骤i中找到的子矩阵,直到达到指定的层次结构级别,或者直到我们有一组有限的子矩阵不能进一步分解。

        我正在尝试提出一种算法来帮助我做上面的(i)和(ii)。我将在C ++,Python或C#中实现逻辑(在不断增加的优先级中),这取决于哪个是最容易做的和/或我碰巧得到片段来让我开始实现算法。

1 个答案:

答案 0 :(得分:1)

我不确定我是否正确理解了这个问题。

首先,ypu想要找到符合你的2个criterea的所有子矩阵。 这就像我认为的图分解问题或集合覆盖问题,你可以有一个递归函数并迭代矩阵来找到所有可用的子矩阵。

enum PieceTypes
{
    White,
    Black
}

class Box
{
    public PieceTypes PieceType { get; set; }

    public uint Units { get; set; }

    public int s, p;
    public Box(PieceTypes piecetype, uint units)
    {
        PieceType = piecetype;
        Units = units;
    }
}

class Matrix
{
    public Box[,] Boxes;
    public int Scale, S, P, MaxNum, MaxDist;
    public List<List<Box>> Configurations;
    public Matrix(int s, int p, int scale, int maxnum, int maxdist)
    {
        S = s;
        P = p;
        Scale = scale;
        Boxes = new Box[S, P];
        MaxNum = maxnum;
        MaxDist = maxdist;
        Configurations = new List<List<Box>>();
    }

    public void Find(List<Box> Config, int s, int p)
    {
        // Check the max number thats valid for your configuration
        // Check that the current p and s are inside matrix
        if (Config.Count() < MaxNum && s >= 0 && s < S && p >= 0 && p < P)
        {

            foreach (Box b in Config)
            {
                if (Valid(b, Boxes[s, p]))
                {
                    Boxes[s, p].s = s;
                    Boxes[s, p].p = p;
                    Config.Add(Boxes[s, p]);
                    break;
                }

            }
            Find(Config, s + 1, p);
            Find(Config, s - 1, p);
            Find(Config, s, p + 1);
            Find(Config, s, p - 1);
        }
        if (Config.Count() > 0) Configurations.Add(Config);
        Config.Clear();
    }

    public bool Valid(Box b1, Box b2)
    {
        // Create your dist funtion here
        // or add your extra validation rules like the PieceType
        if (Math.Sqrt((b1.s - b2.s) ^ 2 + (b1.p - b2.p) ^ 2) <= MaxDist && b1.PieceType == b2.PieceType) return true;
        else return false;
    }

}

我没有使用最好的数据结构,我简化了解决方案。我希望它有所帮助。