草庐IT

c# - 具有完整子结构的矩阵的 "Matrix decomposition"

coder 2023-08-22 原文

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

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

  • 我有一个 SxP 矩阵,它形成了一个类似 S.P“盒子”结构的网格。这是主矩阵 .

  • 这就是(空)主矩阵的样子。矩阵中的每个正方形都简称为一个盒子。矩阵可以被视为一种“游戏板”,例如一个棋盘。纵轴使用区间标度(即实数)测量,水平轴使用单调递增的非负整数测量。


  • 还有一个额外的子矩阵概念(如前所述)。子矩阵只是特定配置中的盒子的集合,并具有指定给盒子的特定数量和块类型(参见下面的黑色和白色块)。我有这些的有限集 子矩阵 - 我称之为我的 lexicon或用于执行有效矩阵组合/分解的词汇。

  • 子矩阵的“正式”定义是它是包含在主矩阵中的 M 个框的配置,满足以下条件:
  • 1 <><= 4="">
  • 任意两个相邻框之间的“间隙”G(即距离)满足:1<=><= 2*(垂直单位)。="">

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



    上图说明了一个简单的子矩阵加法。带有橙色边框/框的单位是子矩阵 - 构成我词典一部分的公认单位。你会注意到我在我的子矩阵中引入了进一步的注释。这是因为(使用国际象棋类比),我可以在棋盘上使用两种类型的棋子。 表示黑色块, W (图中未显示),代表一块白色。公认的单位(或词素/子矩阵) 有一个简单的等价关系,允许在白块和黑块之间进行转换。这种关系可用于进一步分解子矩阵以仅使用黑色块、白色块或两者的组合。

    为简单起见,我省略了指定等价关系。但是,如果有人觉得所提出的问题在没有额外细节的情况下并不是“太难”,我将很乐意扩大范围。现在,我试图让事情尽可能简单,以避免人们与“信息过载”混淆。
  • 子矩阵中的每个框都包含一个有符号整数,表示项目的单位数。盒子的每个“配置”(连同它的有符号整数和块类型,即黑色或白色块)被称为一个“识别单元”。
  • 子矩阵可以以重叠的方式放置在主矩阵中。无论“框”在哪里重叠,生成的子矩阵框中的单元数都是组成框的单元数之和(如上图第二张图所示)。

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

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

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

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

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

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

    最佳答案

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

    所以首先你想找到所有符合你的 2 标准的子矩阵。
    我认为这就像图分解问题或集合覆盖问题,您可以在其中使用递归函数并迭代矩阵以找到所有可用的子矩阵。

    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;
        }
    
    }
    

    我没有使用最好的数据结构,我已经简化了解决方案。我希望它在某种程度上有帮助。

    关于c# - 具有完整子结构的矩阵的 "Matrix decomposition",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3704566/

    有关c# - 具有完整子结构的矩阵的 "Matrix decomposition"的更多相关文章

    1. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

      我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

    2. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

      我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

    3. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

      我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

    4. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

      我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

    5. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

      为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

    6. ruby-on-rails - 迷你测试错误 : "NameError: uninitialized constant" - 2

      我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test

    7. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

      我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

    8. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

      我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

    9. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

      当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

    10. c# - 如何在 ruby​​ 中调用 C# dll? - 2

      如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

    随机推荐