主从分解而不是正交分解

  说到分解,很多人心中的意象大概只有正交分解。正交分解无疑是最重要的一种分析方法,它也是所谓“分而治之”思想最常见的实现策略。但是正交分解一般潜在的假定是分解后的子部分是大致均衡的,它们是相对具有独立价值的,可以彼此脱离独立发展。这是分解后实现系统解耦的重要原因。http://canonical.iteye.com/blog/33885 但是物理学中另一种重要的分析学思想是微扰论(Perturbation). 针对一个复杂的物理现象,首先建立一个全局的规范的模型,然后考虑各种微扰条件对原有模型的影响。在小扰动情况下,模型的变化部分往往可以被线性化,被局域化,因而问题得到简化。微扰分析得到的解依赖于全局模型的解而存在,因而这是一种主从关系的分解方式。但是如果主体模型是我们已经熟知的物理现象,则我们关注的重点可以全部放在扰动解上,认为所有特定的物理规律都体现在扰动解中。如果微扰分析得到的物理元素足够丰富,则微扰模型本身可以成为独立的研究对象,在其中我们同样可以发现某种普适的结构规律。


  Witrix平台中系统化的应用主从分解模式,通过类似AOP的技术实现了业务模型与平台技术的自然结合。http://canonical.iteye.com/blog/126467 最近我们的一个产品的新版本即将在全国范围内部署,如何有效的控制众多相近的二次开发版本,同时确保主版本的快速升级,是在架构层面必须解决的问题。http://canonical.iteye.com/blog/73265 在Witrix平台中,各部署版本并不是直接修改主版本源代码得到,而是将差异化代码放在单独的目录中进行管理,由系统运行平台负责将差异化定制代码与主版本代码进行动态融合,实现部署版本的客户化。在这一过程中,系统模型本身支持逆元结构至关重要,否则某些多余的元素无法通过差异性描述去除,则将出现局部模型失效的情况。


   Witrix平台定义了特殊的_custom目录,它的内部目录结构与defaultroot目录相同,系统平台优先使用该目录下文件所提供的功能实现。同时定义了系统参数global.app_id和global.default_app_id,它们分别用来区分当前程序版本以及程序主版本代码。例如当global.app_id=beijing,global.default_app_id=main的时候,系统中装载ui.xml这个标签库时经历如下过程,
1.    装载平台内置的标签库,文件路径为 /_tpl/ui.xml.
2.    根据global.default_app_id设置,装载/_custom/main/_tpl/ui.xml, 其中定义的标签实现将覆盖平台缺省提供的标签实现。对于那些不需要特殊定制的标签,继续使用平台提供的缺省实现。
3.    根据global.app_id设置,装载/_custom/beijing/_tpl/ui.xml, 其中定义的标签实现将覆盖产品主版本的标签实现。

      基础平台中对于代码动态融合定义了精细的融合策略,将通过编译技术检查扩展标签的接口与缺省实现的接口相兼容,由此确保代码扩展后不会破坏主版本中的已有调用代码。

   在基础平台的实现中,很多实现代码都是类似

          <df:WhenAllowFinishWf>
            <df:FinishWfButton />
          </df:WhenAllowFinishWf>
 


这样的类似废话的标签调用。但是通过这些标签的标记,我们确立了系统的逻辑结构,标定了系统中可以被安全替换的逻辑片断。

主从分解(Master-Slave Decomposition)是一种在MATLAB中进行并行计算的方法。它将计算任务分解为多个子任务,其中一个作为主任务(Master),负责任务的划分和调度,而其他子任务(Slaves)则并行地执行计算。 在MATLAB中,可以使用Parallel Computing Toolbox中的函数来实现主从分解。下面是一个简单的示例代码: ```matlab % 创建一个并行计算任务对象 task = createTask(); % 定义主任务函数 task.Function = @masterTask; % 定义从任务函数 task.Tasks(1).Function = @slaveTask1; task.Tasks(2).Function = @slaveTask2; task.Tasks(3).Function = @slaveTask3; % 设置从任务的输入参数 task.Tasks(1).InputArguments = {input1}; task.Tasks(2).InputArguments = {input2}; task.Tasks(3).InputArguments = {input3}; % 提交任务并等待完成 submit(task); waitForState(task, 'finished'); % 获取从任务的输出结果 output1 = task.Tasks(1).OutputArguments{1}; output2 = task.Tasks(2).OutputArguments{1}; output3 = task.Tasks(3).OutputArguments{1}; % 主任务函数 function masterTask(task) % 从任务数量 numSlaves = numel(task.Tasks); % 分配任务给从任务 for i = 1:numSlaves send(task, i, 'start'); end % 等待从任务完成并收集结果 for i = 1:numSlaves [msg, idx] = receive(task); if strcmp(msg, 'finished') % 从任务完成,获取输出结果 task.Tasks(idx).OutputArguments = {result}; end end end % 从任务函数 function slaveTask(task) % 接收主任务指令 [msg, idx] = receive(task); if strcmp(msg, 'start') % 执行计算任务 result = doCalculation(task.InputArguments{:}); % 发送完成消息给主任务 send(task, idx, 'finished'); end end % 执行计算的函数 function result = doCalculation(input) % 执行计算任务,返回结果 end ``` 在这个例子中,`masterTask`函数负责主任务的调度和结果的收集,`slaveTask`函数负责执行计算任务。你可以根据实际需求修改代码,并根据需要增加更多的从任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值