草庐IT

c++ - 具有已知矩阵的模板矩阵表达式

coder 2024-02-18 原文

这是一个思维练习,不是一个特定的问题,但我想听听你的意见。假设我有一些使用模板(Eigen、ublas 等)的矩阵表达式 DSL。

现在假设我有一些常量矩阵,例如:

Matrix2 sigma1 = {{0,1}, {1,0}};
Matrix2 sigma2 = {{0,i}, {-i,0}};
... etc

...我对那些涉及运行时值的矩阵进行了一些操作:

a*sigma1 + b*sigma2; // a,b runtime

您有什么想法来实现常量矩阵,以便编译器可以最大程度地优化表达式?特别是,如何将 (i,j) 运算符解析为常量?

最佳答案

根据我对问题空间的理解:给定一个 domain-specific language ,我们想要确定最小变换,使得对数据的某些运算符(例如,(i,j))导致查找常量而不是计算数学公式(例如, a*sigma1 + b*sigma2).

让我们在这里探讨一些可能性:

  • 直接进行数学运算

    0th-level执行。如果您的编译器没有进行显式优化,如果我们直接执行指令会怎样?

    答案视情况而定。但是,在大多数处理器上,您的代码执行将落在 the CPU cache 上。 ,你的汇编和分支执行将被优化到你的核心的最佳能力。该过程的核心是 actually really cool,但我们假设您希望超越这些功能,直接在代码中解决操作的常量化问题。

  • 使用 compiler-compiler 绑定(bind)并捕获空间

    一阶优化将是使用 compiler-compiler 来限制和捕获可能的输入和输出空间。 .虽然这将有效地解决您的输入范围,将其限制为您想要的输入和输出集,但它对性能没有任何影响。所以,我们必须继续前进。

  • StringificationMacro Expansion

    二阶优化将直接对您的值空间执行字符串或宏扩展。虽然这是 fraught with corner-cases and surprising implementation-level tar pits ,如果需要操作,它可以直接由您的编译器完成。 (另请参阅:loop unwinding)

  • closed-form expression 的手动推导和堆栈绑定(bind)可满足性
    (例如,使用查找表)

    最后,我们的三阶优化是直接绑定(bind)您的空间。这要求您有一个定义明确的 closed-form relation具有有限的输入和输出空间以有效地工作。如果此关系无法确定或没有界限,you're out of luck如果不知道有更好的实现,应该考虑保留当前的实现。

在这些优化技术中,最适用于linear algebraic operations考虑到您所描述的问题范围,是后两者。由于大多数操作(例如矩阵平移、旋转和缩放操作)本质上都是确定性的,因此您确实可以有效地优化和限制您的空间。

更理论化的答案,建议咨询http://cs.stackexchange.com , http://cstheory.stackexchange.com , 和 http://math.stackexchange.com .两者都有很多很多线程专门用于 decidability和封闭形式的证明,polynomial solutions对于整类方程。

关于c++ - 具有已知矩阵的模板矩阵表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10004487/

有关c++ - 具有已知矩阵的模板矩阵表达式的更多相关文章

  1. 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..

  2. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  3. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  4. ruby 正则表达式 - 如何替换字符串中匹配项的第 n 个实例 - 2

    在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg

  5. ruby-on-rails - Rails 3.1 中具有相同形式的多个模型? - 2

    我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#

  6. 旋转矩阵的几何意义 - 2

    点向量坐标矩阵的几何意义介绍旋转矩阵的几何含义之前,先介绍一下点向量坐标矩阵的几何含义点:在一维空间下就是一个标量,如同一条直线上,以任意某一个位置为0点,以一定的尺度间隔为1,2,3...,相反方向为-1,-2,-3...;如此就形成了一维坐标系,这时候任何一个点都可以用一个数值表示,如点p1=5,即即从原点出发沿着x轴正方向移动5个尺度;点p2=-3,负方向移动3个尺度;     在一维坐标系上过原点做垂直于一维坐标系的直线,则形成了二维坐标系,此时描述一个点需要两个数值来表示点p3=(3,2),即从原点出发沿着x轴正方向移动3个尺度,在此基础上沿着y轴正方向移动两个尺度的位置就是点p3。

  7. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  8. ruby-on-rails - Mandrill API 模板 - 2

    我正在使用Mandrill的RubyAPIGem并使用以下简单的测试模板:testastic按照Heroku指南中的示例,我有以下Ruby代码:require'mandrill'm=Mandrill::API.newrendered=m.templates.render'test-template',[{:header=>'someheadertext',:main_section=>'Themaincontentblock',:footer=>'asdf'}]mail(:to=>"JaysonLane",:subject=>"TestEmail")do|format|format.h

  9. ruby - 正则表达式将非英文字母匹配为非单词字符 - 2

    @raw_array[i]=~/[\W]/非常简单的正则表达式。当我用一些非拉丁字母(具体来说是俄语)尝试时,条件是错误的。我能用它做什么? 最佳答案 @raw_array[i]=~/[\p{L}]/使用西里尔字符进行测试。引用:http://www.regular-expressions.info/unicode.html#prop 关于ruby-正则表达式将非英文字母匹配为非单词字符,我们在StackOverflow上找到一个类似的问题: https://

  10. ruby - Chef Ruby 遍历 .erb 模板文件中的属性 - 2

    所以这可能有点令人困惑,但请耐心等待。简而言之,我想遍历具有特定键值的所有属性,然后如果值不为空,则将它们插入到模板中。这是我的代码:属性:#===DefaultfileConfigurations#default['elasticsearch']['default']['ES_USER']=''default['elasticsearch']['default']['ES_GROUP']=''default['elasticsearch']['default']['ES_HEAP_SIZE']=''default['elasticsearch']['default']['MAX_OP

随机推荐