精华内容
下载资源
问答
  • 针对常用的迭代追踪类算法难以保证低采样下光谱重构的成功率与精度的问题,提出了一种在低采样下光谱重构中字典原子选取的优化方法。利用AVIRIS和ROSIS高光谱数据构建光谱稀疏字典并进行压缩感知光谱重构实验,分别...
  • Facebook 重构:抛弃 Sass / Less ,迎接原子化 CSS 时代

    千次阅读 多人点赞 2021-01-15 17:31:39
    在这篇文章中,我们将看到什么是Atomic CSS(原子 CSS),它如何与 Tailwind CSS 这种实用工具优先的样式库联系起来,目前很多大公司在 React 代码仓库中使用它们。 由于我不是这方面的专家,所以我不会去深入探讨它...

    本文转载自 前端从进阶到入院,作者 ssh前端

    随着 Facebook 和 Twitter 最近的产品部署,我认为一个新的趋势正在缓慢增长:Atomic CSS-in-JS。

    在这篇文章中,我们将看到什么是Atomic CSS(原子 CSS),它如何与 Tailwind CSS 这种实用工具优先的样式库联系起来,目前很多大公司在 React 代码仓库中使用它们。

    由于我不是这方面的专家,所以我不会去深入探讨它的利弊。我只是希望能帮助你了解它的大致内容。

    先抛出一个令人开心的结论,新的 CSS 编写和构建方式让 Facebook 的主页减少了 80% 的 CSS 体积。

    什么是原子 CSS?

    你可能听说过各种 CSS 方法,如 BEM, OOCSS…

    <button class="button button--state-danger">Danger button</button>

    现在,人们真的很喜欢 Tailwind CSS 和它的 实用工具优先(utility-first)的概念。这与 Functional CSS 和 Tachyon[3] 这个库的理念非常接近。

    <button
      class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded"
    >
      Button
    </button>

    用海量的实用工具类(utility classes)组成的样式表,让我们可以在网页里大显身手。

    原子 CSS 就像是实用工具优先(utility-first)CSS 的一个极端版本: 所有 CSS 类都有一个唯一的 CSS 规则。原子 CSS 最初是由 Thierry Koblentz (Yahoo!)在 2013 年挑战 CSS 最佳实践时使用的。

    /* 原子 CSS */
    .bw-2x {
      border-width: 2px;
    }
    .bss {
      border-style: solid;
    }
    .sans {
      font-style: sans-serif;
    }
    .p-1x {
      padding: 10px;
    }
    /* 不是原子 CSS 因为这个类包含了两个规则 */
    .p-1x-sans {
      padding: 10px;
      font-style: sans-serif;
    }

    使用实用工具/原子 CSS,我们可以把结构层和表示层结合起来:当我们需要改变按钮颜色时,我们直接修改 HTML,而不是 CSS!

    这种紧密耦合在现代 CSS-in-JS 的 React 代码库中也得到了承认,但似乎 是 CSS 世界里最先对传统的关注点分离有一些异议。

    CSS 权重也不是什么问题,因为我们使用的是最简单的类选择器。

    我们现在通过 html 标签来添加样式,发现了一些有趣的事儿:

    • 我们增加新功能的时候,样式表的增长减缓了。
    • 我们可以到处移动 html 标签,并且能确保样式也同样生效。
    • 我们可以删除新特性,并且确保样式也同时被删掉了。

    可以肯定的缺点是,html 有点臃肿。对于服务器渲染的 web 应用程序来说可能是个缺点,但是类名中的高冗余使得 gzip 可以压缩得很好。同时它可以很好地处理之前重复的 css 规则。

    一旦你的实用工具/原子 CSS 准备好了,它将不会有太大的变化或增长。可以更有效地缓存它(你可以将它附加到 vendor.css 中,重新部署的时候它也不会失效)。它还具有相当好的可移植性,可以在任意其他应用程序中使用。

    实用工具/原子 CSS 的限制

    实用工具/原子 CSS 看起来很有趣,但它们也带来了一些挑战。

    人们通常手工编写实用工具/原子 CSS,精心制定命名约定。但是很难保证这个约定易于使用、保持一致性,而且不会随着时间的推移而变得臃肿。

    这个 CSS 可以团队协作开发并保持一致性吗?它受巴士因子的影响吗?

    巴士系数是软件开发中关于软件专案成员之间讯息与能力集中、未被共享的衡量指标,也有些人称作“货车因子”、“卡车因子”(lottery factor/truck factor)。一个专案或计划至少失去若干关键成员的参与(“被巴士撞了”,指代职业和生活方式变动、婚育、意外伤亡等任意导致缺席的缘由)即导致专案陷入混乱、瘫痪而无法存续时,这些成员的数量即为巴士系数。

    你还需要预先开发好一个不错的实用工具/原子样式表,然后才能开始开发新功能。

    如果实用工具/原子 CSS 是由别人制作的,你将不得不首先学习类命名约定(即使你知道 CSS 的一切)。这种约定是有主观性的,很可能你不喜欢它。

    有时,你需要一些额外的 CSS,而实用工具/原子 CSS 并不提供这些 CSS。没有约定好的方法来提供这些一次性样式。

    Tailwind 赶来支援

    Tailwind 使用的方法是非常便捷的,并且解决了上述一些问题。

    它通过 Utility-First 的理念来解决 CSS 的一些缺点,通过抽象出一组类名 -> 原子功能的集合,来避免你为每个 div 都写一个专有的 class,然后整个网站重复写很多重复的样式。

    传统卡片样式写法:

     

    图片

     

    Tailwind 卡片样式写法:

     

    图片

     

    它并不是真的为所有网站提供一些唯一的实用工具 CSS,取而代之的是,它提供了一些公用的命名约定。通过一个配置文件,你可以为你的网站生成一套专属的实用工具 CSS。

    ssh 注:这里原作者没有深入介绍,为什么说是一套命名约定呢而不是生成一些定死的 CSS 呢?

    举几个例子让大家感受一些,Tailwind 提供了一套强大的构建系统,比如默认情况下它提供了一些响应式的断点值:

    // tailwind.config.js
    module.exports = {
      theme: {
        screens: {
          'sm': '640px',
          // => @media (min-width: 640px) { ... }
    
          'md': '768px',
          // => @media (min-width: 768px) { ... }
    
          'lg': '1024px',
          // => @media (min-width: 1024px) { ... }
    
          'xl': '1280px',
          // => @media (min-width: 1280px) { ... }
        }
      }
    }
    

    你可以随时在配置文件中更改这些断点,比如你所需要的小屏幕 sm 可能指的是更小的 320px,那么你想要在小屏幕时候采用 flex 布局,还是照常写 sm:flex,遵循同样的约定,只是这个 sm 已经被你修改成适合于项目需求的值了。

    在比如说,Tailwind 里的 spacing 掌管了 margin、padding、width 等各个属性里的代表空间占用的值,默认是采用了 rem 单位,当你在配置里这样覆写后:

    // tailwind.config.js
    module.exports = {
      theme: {
        spacing: {
          '1': '8px',
          '2': '12px',
          '3': '16px',
          '4': '24px',
          '5': '32px',
          '6': '48px',
        }
      }
    }

    你再去写 h-6(height), m-2(margin), mb-4(margin-bottom),后面数字的意义就被你改变了。

    也许从桌面端换到移动端项目,这个 6 代表的含义变成了 6rem,但是这套约定却深深的印在你的脑海里,成为你知识的一部分了。

    Tailwind 的知识可以迁移到其他应用程序,即使它们使用的类名并不完全相同。这让我想起了 React 的「一次学习,到处编写」理念。

    我看到一些用户反馈说,Tailwind 提供的类名能覆盖他们 90% - 95% 的需求。这个覆盖面似乎已经足够广了,并不需要经常写一次性的 CSS 了。

    此时,你可能想知道为什么要使用原子 CSS 而不是 Tailwind CSS?强制执行原子 CSS 规则的一个规则,一个类名,有什么好处?你最终会得到更大的 html 标签和更烦人的命名约定吗?Tailwind 已经有了足够多的原子类了啊。

    那么,我们是否应该放弃原子 CSS 的想法,而仅仅使用 Tailwind CSS?

    Tailwind 是一个优秀的解决方案,但仍然有一些问题没有解决:

    • 需要学习一套主观的命名约定

    • CSS 规则插入顺序仍然很重要

    • 未使用的规则可以轻松删除吗?

    • 我们如何处理剩下的一次性样式?

    与 Tailwind 相比,手写原子 CSS 可能不是最方便的。

    和 CSS-in-JS 比较

    CSS-in-JS 和实用工具/原子 CSS 有密切关系。这两种方法都提倡使用标签进行样式化。以某种方式试图模仿内联样式,这让它们有了很多相似的特性(比如在移动某些功能的时候更有信心)。

    Christopher Chedeau 一直致力于推广 React 生态系统中 CSS-in-JS 理念。在很多次演讲中,他都解释了 CSS 的问题:

    1. 全局命名空间
    2. 依赖
    3. 无用代码消除
    4. 代码压缩
    5. 共享常量
    6. 非确定性(Non-Deterministic)解析
    7. 隔离

    实用工具/原子 CSS 也解决了其中的一些问题,但也确实没法解决所有问题(特别是样式的非确定性解析)。

    如果它们有很多相似之处,那我们能否同时使用它们呢?

    探索原子 CSS-in-JS

    原子 CSS-in-JS 可以被视为是“自动化的原子 CSS”:

    • 你不再需要创建一个 class 类名约定

    • 通用样式和一次性样式的处理方式是一样的

    • 能够提取页面所需要的的关键 CSS,并进行代码拆分

    • 有机会修复 JS 中 CSS 规则插入顺序的问题

    我想强调两个特定的解决方案,它们最近推动了两个大规模的原子 CSS-in-JS 的部署使用,来源于以下两个演讲。

    • React-Native-Web at Twitter。

    • Stylex at Facebook。

    也可以看看这些库:

    • Styletron
    • Fela
    • Style-Sheet
    • cxs
    • otion
    • css-zero
    • ui-box
    • style9
    • stitches
    • catom

    React-Native-Web

    React-Native-Web 是一个非常有趣的库,让浏览器也可以渲染 React-Native 原语。不过我们这里并不讨论跨平台开发(演讲里有更多细节)。

    作为 web 开发人员,你只需要理解 React-Native-Web 是一个常规的 CSS-in-JS 库,它自带一些原始的 React 组件。所有你写 View 组件的地方,都可以用 div 替换。

    React-Native-Web 的作者是 Nicolas Gallagher,他致力于开发 Twitter 移动版。他们逐渐把它部署到移动设备上,不太确定具体时间,大概在 2017/2018 年左右。

    从那以后,很多公司都在用它(美国职业足球大联盟、Flipkart、Uber、纽约时报……),但最重要的一次部署,则是由 Paul Armstrong 领导的团队在 2019 年推出的新的 Twitter 桌面应用。

    Stylex

    Stylex 是一个新的 CSS-in-JS 库,Facebook 团队为了 2020 年的 Facebook 应用重构而开发它。未来可能会开源,有可能用另一个名字。

    值得一提的是,React-Native-Web 的作者 Nicolas Gallagher 被 Facebook 招安。所以里面出现一些熟悉的概念一点也不奇怪。

    我的所有信息都来自演讲 :),还需要等待更多的细节。

    可扩展性

    不出所料,在 Atomic CSS 的加成下,Twitter 和 Facebook 的 CSS体积都大幅减少了,现在它的增长遵循的是对数曲线。不过,简单的应用则会多了一些 初始体积

    Facebook 分享了具体数字:

    • 旧的网站仅仅首页就用了 413Kb 的 CSS
    • 新的网站整个站点只用了 74Kb,包括暗黑模式

    源码和输出

    这两个库的 API 看起来很相似,但也很难说,因为我们对 Stylex 了解不多。

    值得强调的是,React-Native-Web 会扩展 CSS 语法糖,比如 margin: 0,会被输出为 4 个方向的 margin 原子规则。

    以一个组件为例,来看看旧版传统 CSS 和新版原子 CSS 输出的区别。

    <Component1 classNames="class1" /> <Component2 classNames="class2" />
    .class1 {
      background-color: mediumseagreen;
      cursor: default;
      margin-left: 0px;
    }
    .class2 {
      background-color: thistle;
      cursor: default;
      jusify-content: flex-start;
      margin-left: 0px;
    }
    

    可以看出这两个样式中 cursor 和 margin-left 是一模一样的,但它在输出中都会占体积。

    再来看看原子 CSS 的输出:

    <Component1 classNames="classA classC classD" />
    <Component2 classNames="classA classB classD classE" />
    class a {
      cursor: default;
    }
    class b {
      background-color: mediumseagreen;
    }
    class C {
      background-color: thistle;
    }
    class D {
      margin-left: 0px;
    }
    class E {
      jusify-content: flex-start;
    }
    
    

    可以看出,虽然标签上的类名变多了,但是 CSS 的输出体积会随着功能的增多而减缓增长,因为出现过一次的 CSS Rule 就不会再重复出现了。

    生产环境验证

    我们看看 Twitter 上的标签是什么样子的:

    现在,让我们来看看新 Facebook:

    很多人可能会被吓到,但是其实它很好用,而且保持了可访问性。

    在 Chrome 里检查样式可能有点难,但 devtools 里就看得很清楚了:

    CSS 规则顺序

    与手写的工具/原子 CSS 不同,JS 库能让样式不依赖于 CSS 规则的插入顺序。

    在规则冲突的情况下,生效的不是标签上 class attribute 中的最后一个类,而是样式表中最后插入的规则。

    以这张图为例,我们期望的是书写在后blue 类覆盖前面的类,但实际上 CSS 会以样式表中的顺序来决定优先级,最后我们看到的是红色的文字。

    在实际场景中,这些库避免在同一个元素上写入多个规则冲突的类。它们会确保标签上书写在最后的类名生效。其他的被覆盖的类名则被规律掉,甚至压根不会出现在 DOM 上。

    const styles = pseudoLib.create({
      red: {color: "red"},
      blue: {color: "blue"},
    });
    
    // 只会输出 blue 相关的 CSS
    <div style={[styles.red, styles.blue]}>
      Always blue!
    </div>
    
    // 只会输出 red 相关的 CSS
    <div style={[styles.blue, styles.red]}>
      Always red!
    </div>
    

    注意:只有使用最严格的原子 CSS 库才能实现这种可预测的行为。

    如果一个类里有多个 CSS 规则,并且只有其中的一个 CSS 规则被覆盖,那么 CSS-in-JS 库没办法进行相关的过滤,这也是原子 CSS 的优势之一。

    如果一个类只有一个简单的 CSS 规则,如 margin: 0,而覆盖的是 marginTop: 10。像 margin: 0 这样的简写语法被扩展为 4 个不同的原子类,这个库就能更加轻松的过滤掉不该出现在 DOM 上的类名。

    仍然喜欢 Tailwind?

    只要你熟悉所有的 Tailwind 命名约定,你就可以很高效的完成 UI 编写。一旦你熟悉了这个设定,就很难回到手写每个 CSS 规则的时代了,就像你写 CSS-in-JS 那样。

    没什么能阻止你在原子 CSS-in-JS 的框架上建立你自己的抽象 CSS 规则,Styled-system 就能在 CSS-in-JS 库里完成一些类似的事情。它基于一些约定创造出一些原子规则,在 emotion 中使用它试试:

    import styled from '@emotion/styled';
    import { typography, space, color } from 'styled-system';
    
    const Box = styled('div')(typography, space, color);
    

    等效于:

    <Box
      fontSize={4}
      fontWeight="bold"
      p={3}
      mb={[4, 5]}
      color="white"
      bg="primary"
    >
      Hello
    </Box>

    甚至有可能在 JS 里复用一些 Tailwind 的命名约定,如果你喜欢的话。

    先看些 Tailwind 的代码:

    <div className="absolute inset-0 p-4 bg-blue-500" />

    我们在谷歌上随便找一个方案,比如我刚刚发现 react-native-web-tailwindcss:

    import { t } from 'react-native-tailwindcss';
    
    <View style={[t.absolute, t.inset0, t.p4, t.bgBlue500]} />;
    

    就生产力的角度而言,并没有太大的不同。甚至可以用 TS 来避免错别字。

    结论

    这就是我要说的关于原子 CSS-in-JS 所有内容。

    我从来没有在任何大型生产部署中使用过原子 CSS、原子 CSS-in-JS 或 Tailwind。我可能在某些方面是错的,请随时纠正我。

    我觉得在 React 生态系统中,原子 CSS-in-JS 是一个非常值得关注的趋势,我希望你能从这篇文章中学到一些有用的东西。

    展开全文
  • 本教程介绍了根据SAXS数据重构大分子形状的串珠(虚拟原子)模型的基本原理和最佳实践。概述许多SAXS实验的预期结果是确定样品的“溶液结构”,即溶液中存在的大分子结构。不幸的是,与晶体学,c...

    文链接:https://bioxtas-raw.readthedocs.io/en/latest/saxs/saxs_bead_models.html

    翻译:刘广峰

    这是RAW-BioSAXS的第四篇。本教程介绍了根据SAXS数据重构大分子形状的串珠(虚拟原子)模型的基本原理和最佳实践。

    概述

    许多SAXS实验的预期结果是确定样品的溶液结构,即溶液中存在的大分子结构。不幸的是,与晶体学,cryoEMNMR不同,SAXS数据不能用于生成高分辨率3D模型(尽管可以用来约束其他结构确定方法)。SAXS经常提供的信息以及SAXS分析的一个共同终点是对样品的低分辨率形状重构

    多年来,珠建模是生成这些低分辨率形状的最方法。近来,已经开发了其他技术,例如以低分辨率直接重构电子密度。尽管如此,珠建模仍然是形状重构的事实标准。

    为什么做串珠模型重构?

    珠模型尽管分辨率较低,但却可以成为了解溶液系统的强大工具。可以将高分辨率结构对接(docked)珠模型中,从而可以对高分辨率结构与溶液结构的一致性进行可视化分析。在没有其他结构信息的情况下,珠模型可用于为系统的整体形状和大小提供重要线索,这通常足以得出有关大分子功能或与其他分子相互作用重要结论。

    尽管珠建模非常有用,但务必牢记两点。首先,即使有高质量的数据,也很容易获得不良的重构,并且在使用它们之前必须仔细评估重构结果。其次,SAXS在假设检验方面比在生成珠模型上更为准确。换句话说,SAXS擅长指出不是什么,但不擅长说明是什么。例如,如果想将高分辨率结构与SAXS数据进行比较,看它们是否一致,那么与将结构对接到珠模型中相比,最好将测得的散射曲线与高分辨率结构的计算散射曲线进行比较。在这种情况下,串珠模型可能对可视化溶液形状和高分辨率结构之间的差异很有用。

    如何做串珠模型重构?

    有许多不同的程序可用于进行串珠建模,有些适合于通用系统,有些则针对特殊的应用进行了调整,例如用于剂光环包含得膜蛋白。无论如何,这些方法都有着相似的步骤

    1、生成一定数量的珠子(又称虚拟原子),并将其随机分配为允许的相之一。通常,珠子是溶剂或大分子,但是某些程序允许两个以上的相,例如区分蛋白质和RNA或大分子和脂质。

    2、珠模型计算散射轮廓,并将其与数据拟合。

    3、在相之间翻转一组随机选择的珠子(例如从溶剂到大分子,反之亦然)。

    4、重新计算从模型到数据的散射曲线。

    5、如果拟合度更好,则接受珠子的变化。如果拟合度较差,以一定的可能性接受珠子的变化(避免局部最小值)。

    6、重复步骤3-5,直到满足收敛标准为止。

    另外,程序通常会对珠模型施加物理约束以改进模型。常见的约束条件是模型的连通性,对展模型给予约束,并基于Rg/Dmax约束模型的大小。

    事实证明,散射曲线不会生成唯一的重构考虑到这一点,采取了类似于蒙特卡洛方法,生成多(通常为10-20)模型,然后取其平均值进行一致重构。

    串珠模型重构的最常程序(远非唯一的程序)是ATSAS软件包中的DAMMIF(或DAMMIN)[1-2]。在本教程的其余部分中,我们将专门讨论如何使用DAMMIF/N,其中许多讨论也适用于其他程序。

    使用DAMMIF/N进行珠模型重构

    DAMMIF是最常用的串珠模型重构程序。

    输入数据

    DAMMIF需要由GNOM(.out文件)生成的P(r)(r)函数作为输入。请注意,如IFT教程中所述,IFT的散射曲线应截断最大q值为8/Rg或〜0.25-0.30 1/埃,以较小者为准。这是因为DAMMIF无法对水层和内部结构进行建模,从而导致较高q处产生误差。截断删除了可能问题的高q数据。

    产生模型

    由于珠建模不会生成唯一的解。为了得到合理的模型可以创建10-20珠模型重构,然后将其平均。这里的建议进行15重构。这意味着需要将DAMMIF运行15次。

    DAMMIF的最易于访问的设置是模式(Mode)对称(Symmetry)各向异性(Anisometry)

    模式:对于模式,选项为快速(fast)或慢速(slow)。快速模式计算很快,但是不够详细,而慢速模式则相反。对于最终的重构,请使用慢速模式。

    对称性:添加对称性约束可以改善重构。如果知道粒子的对称性,则可以指定它。但是,始终建议使用P1对称性进行另一组重构,以验证对称性不会过度约束重构

    各向异性添加各向异性约束可以改善重构效果(译者注:选项为oblate prolate,代表椭球体长轴的方向不同)。如果知道粒子的形状,则可以指定它。但是,始终建议进行一组重构,不使用各向异性约束,以验证对称性不会过度约束重构

    可用的其他高级选项在DAMMIF手册中有介绍。(译者注:只需要搜索DAMMIF manual就可以找到。)

    如果只想快速看一下形状(例如在光束线上收集数据时),则快速模式下进行3次重构就可以达到此目的。

    平均和聚类模型

    生成模型后,下一步是对模型进行平均和聚类。平均操作从各个模型生成一个共形状,并提供重构稳定性的统计数据使用DAMAVER [3]完成。平均输出damaver.pdbdamfilt.pdb模型文件。这对应于模型的两个不同的共形状,分别是宽松定义和严格定义的。但是,这两个模型都不适合实际数据,因此通常不应该用于显示。DAMAVER还将指定最可能的单个模型。如果不优化DAMAVER的结果,则应使用最有可能的模型作为最终结果。

    聚类使用DAMCLUST [4]完成,聚类的模型彼此之间比与其他模型更相似。这是一种评估重构模糊性的方法,将在下面的重构评估一节中进一步讨论。

    创建最终的精模型

    DAMAVER的输出,特别是damstart.pdb文件,可以用作DAMMIN的输入文件以创建最终的精模型。本质上,damstart.pdb代表最可能占用体积的保守核心,该核心是通过使用DAMAVER对所有重构进行平均而确定的。DAMMIN保持此核心固定,并完善模型的外部以匹配散射轮廓。关于是否应该进行完善,各种不同的建议(甚至来自软件开发者)。通常应该精修,可以使用DAMAVER确定的最可能模型作为结果

    评估DAMMIN/F重构

    SAXS数据包含非常有限的信息,这既是因为它是在相对较低的q下测量的,又是因为它是从溶液中以随机角度定向的大量粒子中测量的。SAXS散射曲线表示来自单个粒子的散射,在所有可能的方向上取平均值。这样做的实际结果是,通常存在几种可能的形状,会产生相同(或十分相似,以至于在实验噪声中无法区分)散射轮廓。这样,无论整体数据质量如何,都不可能从数据集中重构串珠模型来准确表示溶液中的粒子形状。如果样品是柔性的,或这样品在溶液中以多种构象或低聚态存在,则重构也将具有挑战性,或者干脆不可能。总之,高质量的SAXS数据不能保证良好的串珠模型重构。因此,无论基础数据质量如何,严格评估完成的每项重构都非常重要。

    运行DAMMIFDAMAVERDAMCLUSTSASRES [5](作为DAMAVER的一部分运行)和AMBIMETER [6]时,会生成评估重构所需的信息。尽管可以通过这些程序生成的文件都可以访问,但是在RAW中运行DAMMIF时,RAW会收集并显示这些文件的信息。

    eebc13d6cab5038a151a967694638c7e.png

    良好DAMMIF/N重构的标准

    模糊度得分<2.5(最好是<1.5)

    NSD <1.0

    平均时剔除的模型很少(0-2)

    只有一组模型

    对于所有模型,χ2接近1.0

    模型RgDmax接近于p(r)函数的值

    对于所有模型,模型体积计算得到的MW均接近预期MW

    有关这些标准条件的更多信息,请参见下文。

    模糊性

    可以在进行重构之前评估串珠模型重构的潜在模糊性。ATSAS软件包中的AMBIMETER程序可以在GNOMp(r)函数上运行,以评估获得良好重构的可能性。该程序有一个散射曲线数据库,代表由多达7个珠子组成的所有可能的形状。将散射轮廓与这些形状进行比较,AMBIMETER报告有多少与实验散射轮廓匹配。来自AMBIMETER的轮廓越多,可以匹配的形状就越多。

    AMBIMETER报告形状的数目和形状数据的对数(以10为底),这是歧义度得分。他们提供以下解释:

    歧义度得分<1.5--重构很可能是唯一的;

    歧义度得分1.5-2.5--进行重构时要当心;

    歧义度得分> 2.5--重构很可能是模棱两可的。

    这提供了一个快速的初始评估,以决定是否应尝试对数据集进行形状重构。可以从RAW中运行AMBIMETER

    归一化空间差异

    DAMAVER报告了许多不同的结果。最有用的是归一化空间差异(NSD)。本质上,这是用于比较两个不同模型相似程度的尺寸归一化度量。运行DAMAVER时,它将报告所有重构之间NSD的平均值和标准偏差。它还报告每个模型的平均NSD

    平均NSD通常用于评估重构的稳定性。粗略地说,重构稳定性评估为:

    NSD <0.6-重构的稳定性良好;

    NSD0.61.0之间-重构的稳定合理性;

    NSD> 1.0-重构的稳定性较差。

    一般而言,如果平均NSD小于1.0,则可以信任重构(如果所有其他验证指标正常);而如果大于1.0,则应谨慎操作,或不使用所有这些重构模型。

    NSD还用于确定平均时使用哪些模型。如果给定模型的平均NSD高于整体平均NSD两个以上标准差,则该模型不包括在平均值中。如果拒绝超过2个模型(在15个模型中),则可能表示重构不稳定。

    聚类

    DAMCLUST创建的模型集彼此之间的相似性高于其余模型。这是一种评估重构模糊性的方法。如果重构中有多个模型集群,则DAMMIF算法可能正在重构几种不同的形状。这通常表明溶液中可能存在几种不同的形状,这些形状可能会生成实验测量到的散射轮廓因此,这是重构高度模糊的另一个指示。

    需要注意的是,对于高质量数据,其歧义度非常低(来自AMBIMETER的歧义度<0.5),并且产生一组重构,这些重构具有非常小的平均NSD(通常<0.5)和NSD标准偏差(〜0.01), 但是DAMCLUST标识几个(通常> 5个)集群。在这种情况下实际上并没有多个聚类,模型之间的极低偏差正在欺骗DAMCLUST算法。

    请注意,不应将不同的簇视为溶液中中不同形状的代表。即使溶液中存在有限数量不同形状的散射(例如蛋白质的打开和闭合状态),所测得的散射图也是每个组分散射的平均值,并且每个单独的重构都适合所测得的散射曲线。因此,无法仅通过单独的重构来拟合来自组之一的散射,因此不同的簇无法代表溶液中的不同形状。

    模型拟合和参数

    每个模型具有以下参数,可用于评估单个重的成功性:χ2RgDmax体积根据体积估算的分子量以及模型拟合与数据的归一化残差。为了使数据更好地拟合,模型χ2应该接近1,并且模型拟合和数据之间的归一化残差应该是平坦的,并且随机分布在零附近。但是,归一化残差经常显示出一些小的系统偏差,因此不必太在意。χ2值显大于1(1.5-2或更大)表示对数据的拟合度较差或数据的不确定性被低估了。为了区分这两种情况,请查看归一化残差。如果它是平坦且随机分布的,则不确定性很可能被低估了。如果显示出明显的系统偏差,则拟合质量较差。

    从模型获得的RgDmax应该接近从p(r)函数计算得到的RgDmax。如果不是这种情况,则应重新评估p(r)函数,并在必要时重做重构。如果差异仍然存在,则表明重构不能很好地说明溶液中的内容,因此不应该被信任。尽管这里没有关于RgDmax该多接近的硬性规定,经验是,对于高质量数据,Rg之间差异应该少5%,Dmax10%。

    程序报告了每模型的体积,但通常更容易根据该体积计算的分子量与预期分子量进行比较。在这种情况下,M.W.用体积(名义上代表样品的排除体积)除以经验确定的常数1.66[4](在RAW中使用,其他程序可能使用不同的值)来计算。该值是近似的,并且根据大分子的形状在1.52.0之间变化。考虑到系数的变化,该M.W.的确定性不如其他SAXS方法好。这样,它对于指示重的总体大小与预期大小之间的一致性最为有用。如果M.W.与预期M.W.相差20%至25%,则应考虑重

    串珠模型的局限

    尽管串珠模型非常有用,但它们有很多限制,其中许多限制已在本教程的前面部分中提到。总结如下

    即使数据质量很高,串珠模型也可能是模糊的。这是因为溶液中的多个不同形状可以产生相同的散射轮廓,因此无法保证唯一的重构模型,并且重构的成功不仅取决于输入数据的质量,还取决于粒子的固有形状以及粒子的形状对于SAXS的歧义性。因此,应如上所述全面评估所有模型。

    忽略歧义串珠模型仍然仅在特定的粒子形状下效果最佳。在文献[3]关于串珠模型如何适合不同类型形状的讨论。总结是,对于高长宽比的对象(例如长杆或薄盘),带有空隙的对象(例如球形壳)和环,串珠模型往往不太可靠。 对于一般球形结构,它们是最可靠的。

    串珠模型分辨率低。模型表面的细微变化可能微不足道。很少估计的模型分辨率小于20埃,通常它们要大得多。

    串珠模型(通常)不对粒子的水合层或内部结构进行建模。这要求仅使用最大q值为8/Rg0.25-0.30 1/埃(取较小者)的数据。

    最常见的串珠建模程序无法对样品中的多个电子密度进行建模,例如蛋白质-核酸复合物或带有去剂圈的膜蛋白。有专门的程序(例如MONSAMemprot)可以处理这些情况,但是这些程序需要输入其他信息以提供额外的约束。

    珠模型最多与输入数据一样好。尤其是,珠模型对溶液中较大的颗粒(低聚物或非特异性聚集体)的存在非常敏感。在一个简单的模拟中,只有0.7%的聚集体会导致串珠模型发生重大变化。非特定聚集通常表现为从模型主展突出。

    所见,虽然串珠模型对于研究无疑是有用的,但是在进行串珠建模之前,应谨慎行事并确保重构可信赖。

    可视化DAMMIF/N

    可视化DAMMIF/N珠模型与显示典型的大分子结构略有不同。可视化的主要方式有两种,要么是单个的珠子,要么是更常见的是定义模型边缘的轮廓 两种表示形式通常都设为半透明的,以便可以同时看到与珠模型对接的高分辨率结构。

    要记住的主要细节是,要获得正确的可视化效果,必须为模型设置正确的珠大小,该大小在DAMMIF/N .pdb文件的头文件中给出。

    (译者注:忽略了在ChimeraXPyMOL程序中实现可视化的步骤,感兴趣的可以参考原文,也可以看本公众号之前发表的步骤Steps:制作虚拟原子模型图。)

    常见问题

    必须重构串珠模型吗?

    不。这完全取决于数据要说明什么问题。但是,尤其是如果系统显示出性的迹象,或者AMBIMETER报告了较高的歧义度,即使愿意,也不必费心制作串珠模型。

    如何将高分辨率结构对接到串珠模型?

    如果高分辨率结构相对完整(包含溶液中的所有残基,理想情况下包括翻译后修饰),则可以使用SUPCOMB [7]之类的程序将结构自动拟合进串珠模型。如果缺少大量结构(例如较大的loop环)或只有一个多亚基复合物的一个亚基,则必须手动将结构对接到轮廓中。

    珠模型和高分辨率结构不同哪一个是对的?

    也许两者都!这实际上取决于输入。如果已经按照上述方法验证了珠模型,并且看起来不错,那么它很可能代表溶液中的低分辨率形状。还应该验证高分辨率形状是否包含所有残基,通常高分辨率结构缺少诸如loop环或NC末端区域。

    如果两个模型都很好,则取决于获得高分辨率形状的方式。模型可能是正确的,代表着不同条件下形状。例如,在晶体学中通常会看到由于大分子堆积而引起的人工结构

    当然,将高分辨率结构与SAXS数据进行比较的最好方法不是将其对接珠模型中,而是使用CRYSOLFoXS等程序将其与实验数据拟合。如果这些拟合不好,则无论串珠模型显示什么,高分辨率结构都无法匹配数据。如果这些拟合很好,而串模型与高分辨率结构不一致,则说明串珠模型是错误的。

    串珠模型不好,怎么办?

    除了在此处列出的方法,还有更多可用的方法,以下是两个常见的方法:

    如果数据显示结构具有柔性,则可以尝试某种基于整体建模的方法,例如EOMSASSIEBilboMD

    如果数据显示结构为刚性,由几个子单元组成,则可以考虑使用刚体建模,例如SASREF

    参考文献

    1. Franke, D. and Svergun, D.I. (2009) DAMMIF, a program for rapid ab-initio shape determination in small-angle scattering. J. Appl. Cryst., 42, 342-346.

    2. D. I. Svergun (1999) Restoring low resolution structure of biological macromolecules from solution scattering using simulated annealing. Biophys J. 2879-2886.

    3. V. V. Volkov and D. I. Svergun (2003). Uniqueness of ab-initio shape determination in small-angle scattering. J. Appl. Cryst. 36, 860-864.

    4. Petoukhov, M.V., Franke, D., Shkumatov, A.V., Tria, G., Kikhney, A.G., Gajda, M., Gorba, C., Mertens, H.D.T., Konarev, P.V. and Svergun, D.I. (2012) New developments in the ATSAS program package for small-angle scattering data analysis. J. Appl. Cryst. 45, 342-350

    5. Anne T. Tuukkanen, Gerard J. Kleywegt and Dmitri I. Svergun(2016) Resolution of ab initio shapes determined from small-angle scattering IUCrJ. 3, 440-447.

    6. M.V. Petoukhov and D.I. Svergun (2015) Ambiguity assessment of small-angle scattering curves from monodisperse systems Acta Cryst. D71, 1051-1058.

    7. M.Kozin & D.Svergun (2001) Automated matching of high- and low-resolution structural models J Appl Cryst. 34, 33-41.

    展开全文
  • CS重构之CoSaMP

    千次阅读 2017-04-13 21:47:45
    CoSaMP也是对OMP的一种改进,每次迭代选择多个原子,除了原子的选择标准之外,它有一点不同于ROMP:ROMP每次迭代已经选择的原子会一直保留,而CoSaMP每次迭代选择的原子在下次迭代中可能会被抛弃。 在这之前先读了下...
    压缩采样匹配追踪(CompressiveSampling MP)是D. Needell继ROMP之后提出的又一个具有较大影响力的重构算法。CoSaMP也是对OMP的一种改进,每次迭代选择多个原子,除了原子的选择标准之外,它有一点不同于ROMP:ROMP每次迭代已经选择的原子会一直保留,而CoSaMP每次迭代选择的原子在下次迭代中可能会被抛弃
    在这之前先读了下参考论文[1],论文前面还是看得懂一点的,讲了一些压缩感知的基础知识,还聊到了压缩重构方法主要分为三类,但是到了第2部分介绍算法的时候又看不懂了,感觉符号都还没聊清楚就开始讲流程了。佩服看得懂的博主,还说很容易就看懂了。。。希望自己好好努力也能看懂这些外文文献,fighting啦!
    那么我先把论文中的流程贴出来,并没有对符号作过多的解释。。。






    然后在网上找到了符合论文中符号的代码。
    functionSest=cosaomp(Phi,u,K,tol,maxiterations)
    Sest = zeros(size(Phi,2),1);
    v = u;
    t = 1;
    numericalprecision=1e-12;
    T = [];
    while(t<=maxiterations)&&(norm(v)/norm(u)>tol)
      y = abs(Phi'*v);
      [vals,z]=sort(y,'descend');
      Omega = find(y>=vals(2*K)&y>numericalprecision);
      T = union(Omega,T);
      b = pinv(Phi(:,T))*u;
      [vals,z]=sort(abs(b),'descend');
      Kgoodindices = (abs(b)>=vals(K)&abs(b)>numericalprecision);
      T = T(Kgoodindices);
      Sest = zeros(size(Phi,2),1);
      phit = Phi(:,T);
      b = pinv(phit)*u;
      Sest(T)=b;
      v = u - phit*b;
      t = t+1;
    end
    接下来综合代码我准备强行解释一波论文算法的伪代码流程,哎呀半懂半懂希望以后要全懂全懂。
    1.Identification(识别)
    大意是说要构造一个signal proxy,在伪代码中构造signal proxy是y=Phi*v,下图是从论文中摘出来的,突然明白了这段话的意思,首先翻译一下。信号重构的最大难点在于找到目标信号中这些最大项所在的位置。CoSaOMP受到RIP的启发,假设字典矩阵的RIP常数为远远小于1的一个值,对s稀疏的信号x,y=Phi*Phi x可以作为信号的一个代理。因为y的每一个s向量的结合的能量与信号x中s个向量的能量相对应。(我觉得这里的Phi应该是理解为字典矩阵的,因为计算内积的时候我们是选择将字典矩阵与残差相乘,残差初始化为观测向量也就是Phi*x)。这一步对应着代码的第8行。

    接着是伪代码中所说的Identify large components,也就是找到内积值中最大的2K项,复制给Ω,对应上述代码的第10行。
    2.Support Merger(合并支撑集)
    代码第11行。
    3.Estimation
    这里是求解一个最小二乘问题,pinv是求伪逆矩阵。
    “b|Tc←0”中的“Tc”应该是T的补集(complementary set),向量b的元素序号为全集,子集T对应的元素等于最小二乘解,补集对应的元素为零。
    4.Pruning(修剪)
    代码第13行,选出b中K个最大项。
    5.Sample Update(更新)



    强行解释结束了,接下来贴出博主的解释。
    1、CoSaMP重构算法流程:




    步骤(5)稍微有点绕,综合代码理解一下还是不难的。
    2、压缩采样匹配追踪(CoSaOMP)Matlab代码(CS_CoSaMP.m)
    function[theta]=CS_CoSaMP(y,A,K) 
    %CS_CoSaOMP Summary of this function goes here 
    %Created by jbb0523@@2015-04-29 
    %Version: 1.1 modified by jbb0523 @2015-05-09 
    %   Detailed explanation goes here 
    %   y = Phi * x 
    %   x = Psi * theta 
    %   y = Phi*Psi * theta 
    %   令 A = Phi*Psi, 则y=A*theta 
    %   K is the sparsity level 
    %   现在已知y和A,求theta 
    %   Reference:Needell D,Tropp J A.CoSaMP:Iterative signal recovery from 
    %   incomplete and inaccurate samples[J].Applied and Computation Harmonic  
    %   Analysis,2009,26:301-321. 
        [y_rows,y_columns]=size(y); 
        if y_rows<y_columns 
            y = y';%y should be a column vector 
        end 
        [M,N]=size(A);%传感矩阵A为M*N矩阵 
        theta = zeros(N,1);%用来存储恢复的theta(列向量) 
        Pos_theta = [];%用来迭代过程中存储A被选择的列序号 
        r_n = y;%初始化残差(residual)为y 
        for kk=1:K%最多迭代K次 
            %(1) Identification 
            product = A'*r_n;%传感矩阵A各列与残差的内积 
            [val,pos]=sort(abs(product),'descend'); 
            Js = pos(1:2*K);%选出内积值最大的2K列 
            %(2) Support Merger 
            Is = union(Pos_theta,Js);%Pos_theta与Js并集 
            %(3) Estimation 
            %At的行数要大于列数,此为最小二乘的基础(列线性无关) 
            if length(Is)<=M 
                At = A(:,Is);%将A的这几列组成矩阵At 
            else%At的列数大于行数,列必为线性相关的,At'*At将不可逆 
                if kk == 1 
                    theta_ls=0; 
                end 
                break;%跳出for循环 
            end 
            %y=At*theta,以下求theta的最小二乘解(Least Square) 
            theta_ls = (At'*At)^(-1)*At'*y;%最小二乘解 
            %(4) Pruning 
            [val,pos]=sort(abs(theta_ls),'descend'); 
            %(5) Sample Update 
            Pos_theta = Is(pos(1:K)); 
            theta_ls = theta_ls(pos(1:K)); 
            %At(:,pos(1:K))*theta_ls是y在At(:,pos(1:K))列空间上的正交投影 
            r_n = y - At(:,pos(1:K))*theta_ls;%更新残差  
            if norm(r_n)<1e-6%Repeat the steps until r=0 
                break;%跳出for循环 
            end 
        end 
        theta(Pos_theta)=theta_ls;%恢复出的theta 
    end 
    3、CoSaMP单次重构测试代码
    以下测试代码基本与OMP单次重构测试代码一样。
    %压缩感知重构算法测试 
    clear all;close all;clc; 
    M = 64;%观测值个数 
    N = 256;%信号x的长度 
    K = 12;%信号x的稀疏度 
    Index_K = randperm(N); 
    x = zeros(N,1); 
    x(Index_K(1:K))=5*randn(K,1);%x为K稀疏的,且位置是随机的 
    Psi = eye(N);%x本身是稀疏的,定义稀疏矩阵为单位阵x=Psi*theta 
    Phi = randn(M,N);%测量矩阵为高斯矩阵 
    A = Phi * Psi;%传感矩阵 
    y = Phi * x;%得到观测向量y 
    %% 恢复重构信号x 
    tic 
    theta = CS_CoSaMP(y,A,K); 
    x_r = Psi * theta;% x=Psi * theta 
    toc 
    %% 绘图 
    figure; 
    plot(x_r,'k.-');%绘出x的恢复信号 
    hold on; 
    plot(x,'r');%绘出原信号x 
    hold off; 
    legend('Recovery','Original') 
    fprintf('\n恢复残差:'); 
    norm(x_r-x)%恢复残差 
    运行结果如下:(信号为随机生成,所以每次结果均不一样)
     1)图:

            2)Command  windows
            Elapsedtime is 0.073375 seconds.
            恢复残差:
            ans=
              7.3248e-015
    4、测量数M与重构成功概率关系曲线绘制例程代码
    以下测试代码基本与OMP测量数M与重构成功概率关系曲线绘制代码一样。增加了“fprintf('K=%d,M=%d\n',K,M);”,可以观察程序运行进度。
    clear all;close all;clc; 
    %% 参数配置初始化 
    CNT = 1000;%对于每组(K,M,N),重复迭代次数 
    N = 256;%信号x的长度 
    Psi = eye(N);%x本身是稀疏的,定义稀疏矩阵为单位阵x=Psi*theta 
    K_set = [4,12,20,28,36];%信号x的稀疏度集合 
    Percentage = zeros(length(K_set),N);%存储恢复成功概率 
    %% 主循环,遍历每组(K,M,N) 
    tic 
    forkk=1:length(K_set) 
        K = K_set(kk);%本次稀疏度 
        M_set = 2*K:5:N;%M没必要全部遍历,每隔5测试一个就可以了 
        PercentageK = zeros(1,length(M_set));%存储此稀疏度K下不同M的恢复成功概率 
        for mm = 1:length(M_set) 
           M = M_set(mm);%本次观测值个数 
           fprintf('K=%d,M=%d\n',K,M); 
           P = 0; 
           for cnt = 1:CNT%每个观测值个数均运行CNT次 
                Index_K=randperm(N); 
                x = zeros(N,1); 
                x(Index_K(1:K))=5*randn(K,1);%x为K稀疏的,且位置是随机的                 
                Phi = randn(M,N)/sqrt(M);%测量矩阵为高斯矩阵 
                A = Phi * Psi;%传感矩阵 
                y = Phi * x;%得到观测向量y 
                theta = CS_CoSaMP(y,A,K);%恢复重构信号theta 
                x_r = Psi * theta;% x=Psi * theta 
                if norm(x_r-x)<1e-6%如果残差小于1e-6则认为恢复成功 
                    P = P + 1; 
                end 
           end 
           PercentageK(mm)=P/CNT*100;%计算恢复概率 
        end 
        Percentage(kk,1:length(M_set))=PercentageK; 
    end 
    toc 
    save CoSaMPMtoPercentage1000%运行一次不容易,把变量全部存储下来 
    %% 绘图 
    S = ['-ks';'-ko';'-kd';'-kv';'-k*']; 
    figure; 
    forkk=1:length(K_set) 
        K = K_set(kk); 
        M_set = 2*K:5:N; 
        L_Mset = length(M_set); 
        plot(M_set,Percentage(kk,1:L_Mset),S(kk,:));%绘出x的恢复信号 
        hold on; 
    end 
    本程序运行结果:

    参考文献:
    [1]D. Needell, J.A. Tropp.CoSaMP: Iterative signal recoveryfrom incomplete and inaccurate samples.http://arxiv.org/pdf/0803.2392v2.pdf
    [2]D.Needell, J.A. Tropp.CoSaMP: Iterative signal recoveryfrom incomplete and inaccurate samples[J]. Communications of theACM,2010,53(12):93-100.
    (http://dl.acm.org/citation.cfm?id=1859229)
    展开全文
  • APP代码重构总结

    2020-04-24 05:03:32
    今天对APP的代码进行重构的总结: 总类控制子类, 子类不可以控制总类, 子类的方法应尽可能原子性, 视图类控制数据类, 数据类不可以控制视图类。 ...

    今天对APP的代码进行重构的总结:

    1. 总类控制子类,
    2. 子类不可以控制总类,
    3. 子类的方法应尽可能原子性,
    4. 视图类控制数据类,
    5. 数据类不可以控制视图类。
    展开全文
  • 针对原子力显微镜(AFM)纳米成像中存在的失真问题,研究了通过探针建模实现AFM扫描图像重构方法.目前探针盲建模算法在重构AFM图像时存在较大误差,因此提出基于探针模型预估计的AFM扫描图像重构方法.该方法采用分区...
  • 利用正交匹配追踪算法对高光谱图像进行压缩感知重构,是通过寻找最优原子对原始信号进行线性表示,使残差不断减小以获取重构信号。在处理基于冗余字典的重构问题时,其耗时主要存在于原子匹配过程和残差更新过程,导致...
  • 现有的大多数原子成像和光谱方法,如电子和扫描隧道显微镜和X射线/光谱学,只能探测电极表面强吸附物质的结合态和/或平面分布,缺少EDLs的三维结构。近日,美国伊利诺伊大学Yingjie Zhang团队和Narayana R. Aluru...
  • 电催化学术QQ群:740997841利用可再生能源,基于铜电极的电化学CO2还原是一种将CO2转化为甲烷、...主要是尚不清楚杂原子是作为催化剂的一部分,还是简单地诱导催化剂重构。有鉴于此,日本名古屋工业大学Hideki Mas...
  • 然后,利用各次迭代选取的最佳匹配原子完成惯性传感器信号的重构,从而达到滤波的目的。仿真结果表明,在该算法下,静态信号的零漂值得到了改善,信噪比提高了10.48 dB,动态信号均方误差降低了28.551(″/s)。相同...
  • 根据访问控制策略中的操作类型、主体属性、客体属性和环境属性将基于属性的访问控制策略划分为多个不相交的原子访问控制规则,并通过与、或等逻辑关系构成的代数表达式,将原子访问控制规则重构出复杂访问控制策略;...
  • 针对稀疏成分分析理论的“两步法”中的源信号重构算法改进,提出一种由相关性加权最小二乘字典学习法与分段正交匹配追踪算法组合的算法,能够解决带权重信号误差的F-范数最小化问题,并通过增加单次迭代的原子数改变...
  • 该算法借鉴传统匹配追踪类算法结构,采用多峰值匹配原则进行原子选择,通过一次迭代确定候选集,然后利用回溯思想对候选集进行二次筛选获得支撑集,实现了跳频信号的精确重构。仿真结果表明,该算法重构性能与传统...
  • AAFBP算法的重构过程可分为2个阶段,在前向阶段利用自适应阈值来选取适量原子加入支撑集,在后向回溯过程中以原子的投影系数大小作为删除依据,利用自适应删除阈值来进行原子的删除,同时克服了自适应过程中存在的...
  • 原子力显微镜技术已在纳米成像中得到了普遍应用。但实验表明,AFM图像在水平方向分辨率较低,其中探针针尖形貌是影响扫描图像分辨率的关键因素之一。为了提高AFM扫描图像的分辨率,改善成像质量,一种可行的方法是...
  • 该方法利用相空间重构产生与混沌信号微分同胚的相空间集,采用匹配追踪方法将信号分解为匹配信号结构的时频原子的线性和,达到无损去噪的目的。对Lorenz混沌系统模拟试验表明,该方法具有良好的去噪效果和计算收敛性。...
  • 压缩采样匹配追踪(CoSaMP)算法是一种有效的压缩感知重构算法,针对其每次迭代选择与去除原子的原则不同导致支撑集估计不够准确,提出一种压缩采样硬阈值追踪重构算法。该算法去除原子时结合硬阈值追踪(HTP)算法...
  • 稀疏度自适应正则回溯匹配追踪算法(SAMP algorithm based on regularized backtracking,SAMP-RB)是一种有效的压缩感知重构算法,在原子选择阶段引入回溯的思想,提高了重构精度,减少了重构时间。但SAMP-RB算法...
  • 蛋白质是生命体的最主要组成元素,作为一种生物大分子机器,蛋白质功能的实现高度依赖于其复杂的三维原子结构。...伴随着最近几年的技术突破,冷冻电镜三维重构技术成为测定蛋白质及其复合物结构的关键技...
  • 压缩感知重构算法之压缩采样匹配追踪(CoSaMP) 转载自彬彬有礼的专栏 ...题目:压缩感知重构算法之压缩采样匹配追踪(CoSaMP) ...CoSaMP也是对OMP的一种改进,每次迭代选择多个原子,除了原子的选择标准之外
  • 该方法构建相关原子库,并将原子离散的参数连续化,能减少重构信号所需的原子数并使分解结果更准确;针对频率范围较大的谐波、衰减振荡等信号,采用快速傅里叶变换对最优原子频率进行预求解,从而降低原子库规模;...
  • 本文采用电子断层扫描技术,结合原子级分辨率离子弹道仿真实验,以修正原子探针层析技术的三维重构图像失真。APT三维重构技术能够对样品器件进行详细的化学分析。 在超大规模集成电路上的纳米级晶体管中,特别是...
  • 压缩感知重构算法之压缩采样匹配追踪(CoSaMP)

    万次阅读 多人点赞 2015-05-02 18:55:57
    CoSaMP也是对OMP的一种改进,每次迭代选择多个原子,除了原子的选择标准之外,它有一点不同于ROMP:ROMP每次迭代已经选择的原子会一直保留,而CoSaMP每次迭代选择的原子在下次迭代中可能会被抛弃。
  • 压缩感知信号重构学习记录-2

    千次阅读 2017-09-21 19:37:45
    OMP算法有效克服了MP算法的时间复杂度大的问题,OMP沿用了匹配追踪算法中的原子选择准则,在重建时每次迭代得到\hat{X},只是通过递归对已选择原子集合进行正交化以保证迭代的最优性,从而减少迭代次数。  实验...
  • 单元测试--重构

    2006-09-19 10:40:00
    一:单元测试:1:在没写函数内容代码前,就要写单元测试类;每个测试类中有TestSuite;2: 如果写单元测试很困难,那么可能是你...2:函数内部要写原子部的代码(有物理意义),3:表达式越长,越复杂,那么就越差劲; 
  • 题目:压缩感知重构算法之压缩采样匹配追踪(CoSaMP...CoSaMP也是对OMP的一种改进,每次迭代选择多个原子,除了原子的选择标准之外,它有一点不同于ROMP:ROMP每次迭代已经选择的原子会一直保留,而CoSaMP每次迭代选择
  • X射线荧光全息术是一种新型的显微成像技术,它能在原子水平上直接观察到晶体...比较由这些全息图重构得到的原子像,发现入射能量范围越宽,其消除孪生像的效果越好,而且随着入射能量的提高,其原子像的分辨力也越高。

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 225
精华内容 90
关键字:

原子重构