精华内容
下载资源
问答
  •  (3)TMS/EEG诱发电位下的局部分散变化。 大脑全脑功能连接的变化可以预测临床干预效果,而全脑功能连接与TMS/EEG的变化均能够追踪临床结果。相比健康被试,我们观察到抑郁患者dlPFC对杏仁核的干扰抑制作用。总之...

    重复经颅磁刺激 (rTMS) 是重度抑郁症 (MDD) 常用的治疗方式,但是我们对经颅磁刺激产生抗抑郁效果的机制了解甚少。此外,我们也缺乏能够用以预测和追踪临床效果的大脑信号,而这些信号能够帮助进行分层与优化治疗。本研究中,我们进行了随机、假性对照的临床试验,在rTMS前后分别测量电生理、神经成像和临床变化。患者(N=36)被随机分为两组,分别接受有效刺激或伪刺激的,针对左背外侧前额叶皮层(dlPFC)的rTMS干预,为期20个连续工作日。为捕捉由rTMS驱动的大脑连接与因果兴奋性上的变化,我们在干预前后均对患者进行了静息态fMRI和TMS/EEG数据采集。通过同时进行的TMS/fMRI,可以评估抑郁组与健康对照组之间大脑因果连接基线的差异。相比伪刺激组,我们发现rTMS引起了:   

    (1)dlPFC的全脑功能连接增强;   

    (2)诱导产生负性dlPFC-杏仁核连接;   

    (3)TMS/EEG诱发电位下的局部分散变化。     

    大脑全脑功能连接的变化可以预测临床干预效果,而全脑功能连接与TMS/EEG的变化均能够追踪临床结果。相比健康被试,我们观察到抑郁患者dlPFC对杏仁核的干扰抑制作用。总之,rTMS通过积极干预,诱导刺激位置产生持久性连接和兴奋性变化后,dlPFC似乎能更好地参与杏仁核自上而下的控制。这些网络功能方法不仅能够预测,也能追踪临床效果,为优化干预方法打开了一扇潜在的大门。本研究由斯坦福大学的学者发表在Neuropsychopharmacology杂志。

     

    引言      

    抑郁症是一种广泛流行的、严重的精神疾病。即使是药物与心理治疗相结合的干预,效果都不甚理想。新的疗法,如重复经颅磁刺激,可以调节脑网络内或网络间的连接。因该疗法建立在对抑郁症脑网络功能障碍的新兴理解上,所以可能促进非侵入式疗法的发展。临床试验表明,针对背外侧前额叶皮层(dlPFC)的10Hz rTMS对于抗抑郁有明显效果,得到了食品与药物管理局许可,并因此在临床上得到广泛应用。即使如此,其治愈率还是令人失望。此外,临床效果虽然得到了一定证明,rTMS技术的发展中还是缺乏神经生理过程,以调整或澄清dlPFC内具体的解剖学靶点,况且我们对该脑区(dlPFC)的理解还存在争议。近期,几个研究试图通过任务态功能性核磁共振成像(fMRI)、个体化脑网络映射和静息态连接的方法,解决与rTMS相关的异质性问题。但前期研究主要:   

    (1)缺乏必要的假性对照,以区分干预效果与安慰剂反应因素。   

    (2)除连接改变外,没有使用因果性脑测量方法来解释rTMS作用机制(如某区域激活导致另一脑区变化)。我们对于rTMS机制理解的不足,使得治疗技术的优化受到了阻碍。       

     

    目前为止,神经成像研究中,在探查rTMS在左侧dlPFC与抑郁症的关系时,均借助传统的脑测量方法(如fMRI或EEG)进行治疗前后的检测。这些研究普遍发现,在rTMS干预后,额叶或颞叶的功能、激活度以及神经连接产生了变化。      

    关于额叶变化:rTMS显示出DMN网络内超连通性(hyperconnectivity)的正常化,dlPFC-内侧前额叶异常连接的恢复,而且可以基于dlPFC-前扣带回或前扣带回-顶叶连接来预测临床结果。      

    关于颞叶变化:左侧dlPFCrTMS结果显示,杏仁核血流量增加,被试对负性面孔的反应降低。      

    除了神经解剖学靶点与rTMS抗抑郁效果相关外,我们关于rTMS如何作用于这些脑区的机制理解也有限。一直以来的概念是,10Hz rTMS通过长期增强作用(LTP)来提升脑网络兴奋度,从而产生治疗影响。但是人类研究中,支持该理论的证据不足。事实上,近期一项关于rTMS(而非大脑切片中电诱发的LTP)的动物研究提出了不同于LTP的另一机制:减少皮层抑制。比如将10 Hz rTMS应用于猫的视觉皮层,会导致长期抑制作用的减弱,单一经颅磁脉冲反弹,这也证明了视觉加工时的抑制减弱。我们最近的研究也曾表明,在类rTMS实验中,用10Hz进行颅内皮层电刺激10分钟,会抑制20到40毫秒的刺激激活潜能。考虑到这种潜能的自然抑制作用,该类研究证明了rTMS可能通过一种先前未知的大脑皮层抑制减弱机制产生作用。因此,理解究竟哪些脑区和神经生理过程受非侵入rTMS影响而改变的一种方法是,使用同步fMRI或EEG,探测由TMS脉冲直接诱发的大脑激活。同步TMS/fMRI亦可揭示哪些下游脑区受到dlPFC刺激影响。      

    为了更好地理解10Hz rTMS疗法机制与预测因子,我们进行了针对重度抑郁症患者的rTMS多模态假性随机对照研究,检测了静息态fMRI下的连接变化(图2)和TMS/EEG诱发的神经反应(图3图4)。另外,我们还使用同步TMS/fMRI对比了抑郁症患者与控制组治疗前的TMS激活反应,来确定rTMS诱发的大脑连接变化能否从原因上解释抑郁症中混乱的神经联系(图5)。我们初始假设重点只是同步TMS/fMRI的临床试验。但是由于设备故障,使得数据收集和试验后测难以在一年半内完成。因此不得不修改计划,转而分析静息态fMRI与TMS/EEG。总体来讲,实验目标同之前一致:   

    (1)检测dlPFC与其他抑郁相关脑区间的因果联系。   

    (2)探查rTMS抗抑郁疗法对于异常脑区连接的影响。      

    我们假设对于左侧dlPFC的10Hz rTMS能诱发dlPFC中刺激部位的连通性变化,在对静息态fMRI与TMS/EEG的异常模式进行调整后,能够反映出上述变化;并且这些变化的强度能够预测、追踪临床效果。总之,结果表明,10Hz dlPFC的rTMS能够对抑郁症产生长时效、临床相关的神经调节作用,这可能部分与从dlPFC到杏仁核的自上而下的控制加强有关。

     

    材料与方法

    被试       

    初始被试共有85位重度抑郁症患者,经过下述标准筛查后,36位患者同意参与本研究,并获得斯坦福大学机构审查委员会的批准(见表S1)。此外,28位健康对照被试同意进行与抑郁症患者获得治疗前相同的实验程序(健康被试不参与再测)。所有抑郁患者年龄介于18至50岁间,右利手,符合DSM-4对于抑郁症的诊断标准。抑郁患者在治疗开始前两周无服用药物。为限制安慰剂反应率,从而减少假性rTMS激活对照,又不增加抗治疗人数,纳入标准允许一次抗抑郁试验失败,但失败次数不得大于3次。排除标准包括:进行MRI的禁止条件(如体内金属);曾失去意识的头部创伤史,这可能降低癫痫发作阈值;癫痫发作史;神经或不可控疾病史;活性物质滥用;精神障碍或双相情感障碍;以及ECT或rTMS失败史。患者可共病焦虑症(但非创伤性应激障碍),若患者符合终生双相情感障碍、物质依赖或精神分裂症的标准也被剔除。我们分别在治疗前(第一天)、治疗中(第十天)及治疗后(第二十天)使用汉密尔顿抑郁评估量表(HamD)对患者抑郁症状进行评测。健康被试无使用药物,且不满足任何一项精神障碍诊断标准。      

    关于静息态fMRI连通性检测,在剔除不符合标准数据后,试验纳入28名健康对照被试和31名抑郁症被试(18例完全主动rTMS, 13例完全假性rTMS)。       关于单脉冲TMS/EEG部分,刺激传递到治疗部位(治疗刺激点位位于额顶叶控制网络FPCN的左侧dlPFC部分,如下图所示)。右侧刺激点位比左侧dlPFC同源点位更靠前(基于它是腹侧注意网络VAN的一个成分),或初级视觉皮层(V1)。FPCN刺激分析包括17名健康控制被试与26名抑郁症患者(16例真刺激,10例假刺激)的rTMS疗法前后测。由于VAN与V1刺激条件作为一种对比,可以帮助深入理解FPCN中dlPFC在治疗前后变化,因此试验分析仅包括主动激活rTMS的患者数据(12例患者的右侧FPCN dlPFC,10例患者的左侧VAN dlPFC,以及15例患者的V1)。      

    关于TMS/fMRI前测成分,21名健康被试(HCs)与20名抑郁患者接受了FPCN和VAN dlPFC位点的刺激。      

    不同研究成分和刺激点位的样本差别反映了刺激有效性、被试有效性和数据质量等因素。

     

    随机化、目标与假性控制       

    本研究主要目的是探查rTMS的神经机制,而非论证主动与假性rTMS临床结果的区别,对比二者的神经影像学研究经常动机不足,因为多个随机试验已证实了假性rTMS的临床效果。所以,为最大化锁定预测或追踪神经信号的可能性,相比假性rTMS组,我们在真rTMS组别中纳入了更多被试。具体做法是,患者以2:1的比例被随机分入积极或假性rTMS治疗中,实验设计采用双盲假性对照。为最大化双盲假性对照设计的效度,我们采用:    

    (1)一个TMS方向传感线圈用来提醒操作者,是否正确操作(真刺激vs.伪刺激);    

    (2)放置在线圈下的电极通过作用于头皮的低强度电刺激来激活伪刺激。这一电刺激假性对照方法的有效性,曾在一篇多点位经颅刺激治疗的研究中得到过证实。(见原文参考文献)     

     研究使用Brainsight无框架立体定向神经导航软件处理分层扫描采集到的高分辨率T1加权解剖学成像,为每位被试定位TMS/fMRI,TMS/EEG和rTMS治疗中的经颅磁刺激部位。进而以鼻窦和双侧耳屏为基准标记,标准化头部位置,在每位被试的自然空间解剖图像中识别头皮的TMS靶点位置。
     

    rTMS 治疗        

    两种rTMS均使用 MagVenture X100 经颅磁电刺激器和液冷B65 A/P蝶形线圈(MagVenture)操作。rTMS拟包含每日左侧dlPFC刺激,由4秒10Hz训练与26秒休息组成,重复37.5分钟(3000次脉冲)。在每个受试者静息运动阈值的120%处进行刺激,该阈值被认为刺激强度最小阈值,在被试左侧初级运动皮层被刺激的情况下,该阈值的刺激可诱发至少50%可见手指运动。假性rTMS治疗则是通过快速翻转TMS线圈与头皮电刺激模仿rTMS。
     

    后测        

    在rTMS结束24小时后,进行临床后测评估,使用静息态fMRI和TMS/EEG范式与治疗前数据对比。

    图1.实验设计.健康被试(HCs)与重度抑郁症患者(MDD)入组并接受静息态fMRI基线,同步TMS/EEG,同步TMS/fMRI检测,以及临床评估。之后患者随机分配参与双盲rTMS和假性对照实验,主要为每日10Hz针对左侧dlPFC的有效或伪刺激。治疗后至少24小时,患者还需进行静息态fMRI、同步TMS/EEG和临床评估的治疗后测。
     

    静息态fMRI-功能连接分析        

    为接近刺激的有效区域,我们围绕被试的刺激坐标,生成了一个12mm的感兴趣区域(ROI)。如前文所述,该锥形ROI由半径为2、4、7、9和12mm球体连接而成,都集中在刺激部位。目的是模仿TMS随距离产生的衰退效果,如ROI刺激点周围2mm内权重为1,2-4mm间权重为0.8,4-6mm间权重为0.6,以此类推。然后将锥体制作成mask,以排除脑外体素干扰。为获取静息态下连接的单一估值,我们计算了每位患者ROI刺激点位的全脑功能连接。我们使用Martuzzi等人提出的全脑功能连接计算方法,即平均mask内每一体素与其他体素BOLD时间序列的相关值的平方。该方法可平均分配正负相关权重(如,高负性相关会增加全脑连通性得分)。这一方法近期得到大量关于神经生理疾病研究的验证,并被证实用于识别前额叶异常连接格外有效。      

    为验证该指标在本研究样本中的重测信度,我们还计算了假性对照组治疗前后个体内和个体间的变异性。我们发现个体间变异显著更小(t11=-3.7,p=0.0036),显示了良好信度。最后,为了确保试验结果的特异性,我们还计算了其他10个随机选择的前额叶种子点的全脑连接,每个种子点都有同上所述的12mm的圆锥体。      

    在计算完全脑功能连接后,我们使用相同的锥形ROI展开后续的配对连接分析,以生成每位被试的种子点-体素相关图。这一步骤使我们能够探查刺激点位与其他脑区间的静息态功能连接,从而看到哪个脑区有助于dlPFC中全脑功能连接的变化。不仅使用探索性全脑分析,我们也使用了一个包含双侧内侧和外侧前额叶皮质、前扣带、杏仁核和扣膜的mask,对大脑连接性进行评估。该mask在先前的研究中被认为包含与抑郁和TMS反应有关的额颞叶结构。
     

    同步TMS/EEG        

    为了评估rTMS治疗前后大脑兴奋度的因果模式,我们进行了同步TMS/EEG映射(N = 16有效rTMS, 12假性对照rTMS,共28例)。单一TMS脉冲被传送至四个皮层靶点:双边FPCNdlPFC点位;注意网络(VAN)左侧前中回的dlPFC;初级视觉皮层(V1)。      

    在TMS单一脉冲作用时,同步记录EEG数据。所有电极的阻抗保持在5 kohm以下,EEG数据以2048Hz采样,以最小化刺激伪迹的持续时间。鼻尖作为参考。

     

    同步TMS/fMRI

    为研究静息态fMRI分析中显示的脑区下游影响的标准模式,以说明治疗相关脑区变化,一组抑郁症患者(N=20)与配对健康对照组(N=21)按拟定流程接受了同步TMS/fMRI扫描。使用MagVenture MR-磁共振 MRI-B91,将单一脉冲作用于FPCN或VAN的左侧dlPFC节点,量化比较下游fMRI的BOLD反应。刺激强度为每位被试静态运动阈限的120%。传送70 TMS脉冲5分钟,每2.4秒一次的七次交替刺激组成10个单元。使用静息fMRI获取磁共振参数,在2秒内完成单个全脑容量的成像,然后扫描仪暂停0.4秒,在此期间可以发送刺激脉冲,每一TMS单元时长16.8秒。我们采用这种交叉聚类方法,以避免在TMS脉冲作用同时获得的fMRI数据被破坏。每一TMS单元时长16.8秒。

     

    结果

    临床结果       

    根据汉密尔顿抑郁量表显示,rTMS组内抑郁症状明显改善(时间效果;F(1,33)=26.4, p < 0.001)。每一治疗组中,5位患者被归为临床应答者(50%临床症状减少,rTMS中有27%,伪刺激rTMS中38%)。与预期效果一致,由于我们以多通道机制为主的实验设计样本量的关系,几个治疗组别无显著临床差别。

     

    静息态fMRI连接

    我们首先采用线性混合模型,检测rTMS治疗是否改变了dlPFC刺激点位的全脑功能连接。结果显示存在显著治疗的组别*时间交互作用(F(1,52) = 6.54, p = 0.013, Cohen’s d = 0.46, N = 31 图2a,b)。这一交互作用由rTMS中全脑功能连接的增加导致(posthoc pairwise test, F(1,28) = 7.28, p = 0.012,Cohen’s d = 0.75, N = 18),但在假性对照组中无连接变化(posthoc pairwise test, F(1,27) = 0.44, p = 0.51,Cohen’s d = 0.29, N = 13)。由rTMS诱发的连通性变化使得抑郁症患者总体上更接近健康被试的脑区连接模式。

    关于空间特异性对照,我们分析了另外10个随机选择的前额叶种子点的全脑功能连接,rTMS并未对这些种子点直接靶向定位。当我们将这10个种子点与刺激点位连接起来时,发现了受刺激部位强双向交互作用驱动的显著三向交互关系(种子点×组别×时间;F(43,420) = 2.16, p < 0.001)。而分别分析时,却无明显组别*时间交互关系(p > 0.1)。

    为进一步理解rTMS带来的dlPFC内连接变化,我们将每位患者的刺激点位生成种子点连接图,以检查抑郁症皮质边缘回路中的靶点(如内外侧额叶、岛叶和杏仁核)。结果揭示,双边杏仁核及对侧dlPFC均发生了明显连接变化(图2)。如上所述,rTMS诱发的变化促使抑郁症患者神经连接更趋近于对照组。值得注意的是,标准负性dlPFC -杏仁核连接仅在rTMS组治疗后才明显。

    图2有效rTMS调节左侧dlPFC刺激点位的神经连接,预测和追踪临床反应。

    a 为每位被试确定左侧dlPFC刺激靶点,基于额顶控制网络(FPCN)位置。

    b 治疗组别(有效刺激,伪刺激)*时间(前测,后测)的rTMS整体功能连接效果。

    c 治疗组别*时间rTMS的功能连接,基于dlPFC刺激点到双侧杏仁核和右侧dlPFC。rTMS治疗后的患者与健康对照已无显著差别,而这些患者在治疗前测中存在明显损伤。右侧dlPFC中,即使在治疗后,患者的连接持续增加。

    d 更低的左侧dlPFC全脑功能连接基线能够预测rTMS中汉密尔顿量表得分变化,这里用基线中位数说明。

    e 左侧dlPFC全脑功能连接的前后测变化与汉密尔顿得分变化相关。

          

    接下来我们确定了dlPFC全脑功能连接是如何影响临床治疗结果的。在rTMS组,基线左侧dlPFC的全脑功能连接可预测临床结果,例如在前测中连接程度较低的患者,却在临床上有更大的改善(线性混合模型,全脑功能连接*时间作用,F(1,31) = 8.52, p = 0.007, Cohen’s d =1.59)。此外,前后测中神经连接的增加与汉密尔顿量表评分变化呈负相关,表明dlPFC全脑功能连接连接增加最多的rTMS组患者,其临床表现也得到最大改善。相反,刺激点位和杏仁核、右侧dlPFC间的连接则不能预测或追踪临床效果。假性对照rTMS组中,基线左侧dlPFC的全脑功能连接同样无法预测临床效果,连接变化与汉密尔顿量表得分不相关。但这些结果应更加细致谨慎地去解读。

     

    TMS/EEG 结果

    进一步,我们想要了解有效刺激与伪刺激rTMS的效果是否在TMS-evoked potential(TEP)上有区别,TEP是通过单一TMS脉冲检验脑区神经生理影响的工具(图3)。对TMS/EEG电位进行多重比较后,在线性混合模型分析中,只有p30(后经颅磁刺激脉冲25-35毫秒)表现出显著的治疗组×时间的交互作用(图3)。也就是,显著交互作用仅分别存在于左侧额叶和顶叶(图3)。额叶和顶叶中明显的p30变化也仅发生在rTMS组中,而非伪刺激组中。

    如图3所示,有效rTMS而非伪刺激rTMS能够降低p30电位。对比健康被试p30反应发现,抑郁患者由rTMS带来的改变趋于p30 TEPs标准化,这在额叶与顶叶集群中相似。虽然有效rTMS组中,抑郁症患者额叶或顶叶集群的p30基线反应,没能通过线性混合模型预测临床变化的效果,但是前额叶p30反应在治疗中变化的数量,与症状变化规模相关。前额叶p30反应越少,临床改善便越多(r=0.72,p=0.0025 图3)

    图3每日有效rTMS(非虚假对照rTMS)调节TMS/EEG p30 电位。

    aTMS/EEG单一脉冲在rTMS与伪刺激rTMS中均作用于左侧dlPFC治疗部位。

    b TEP轨迹示例

    c 所有被试头皮TMS/EEG电位示意图。d 疗法的组别*时间交互作用仅显示在p30电位中(p<0.05,集群校正多次对比)。

    d 该交互作用的-log(p-value)头皮电位图。

    e d中额叶与顶叶的TEP时间序列,分为不同实验组。绿色箭头=额叶集群;蓝色箭头=顶叶集群;阴影竖线表示p30时间段。插图显示每组TEP的0 - 50ms成分。

    f 从显著的额顶集群中提取p30振幅,为每个治疗组绘制治疗前后的TEPs,同时也提取健康对照组(HC)中相同的p30振幅。误差线代表SEM。

    g 各治疗组主要效果产生时间的脑电图。

    h 额叶集群p30振幅的前后差异,与临床症状的前后测差异(HamD)相关关系显示,p30改变程度与症状改善程度相关。

     

    最后,我们通过比较rTMS后,左侧FPCN dlPFC在p30 TEPs中的变化与右侧FPCN dlPFC、左侧VAN dlPFC或V1刺激点位的变化,评估p30结果的点位特异性。我们假设,左侧FPCN dlPFC引发的脑网络变化,最有可能通过TMS/EEG在治疗部位(左侧FPCN)中体现。比较治疗点位和其他点位时,我们观察到明显的刺激*时间交互作用效果(图4),这说明rTMS带来的p30抑制效果只有在单脉冲作用治疗点位后才会产生。总之,rTMS能够抑制p30电位,而更好的抑制与更佳的临床效果相关。

    图4  rTMS后p30抑制的部位特异性a FPCN vs. VAN. Top panel:TMS/EEG刺激位置在左侧dlPFC,与FPCN和VAN对应。刺激点位(FPCN,VAN)*时间(治疗前,治疗后)交互作用的脑区图(p < 0.05, cluster-corrected, linear mixed model). Middle panel:从点位*时间效应估计边际均值。Bottom panel:每个刺激点位的TEPs时间序列.误差线代表SEM.阴影竖线表示p30时间段.带绿色箭头柱表示来自额叶集群的结果;蓝色箭头表示顶叶集群,阴影竖线表示p30时间段.插图显示每组TEP 0-50ms成分.与左侧VAN dlPFC比较,我们观察到显著的刺激部位*时间的交互作用效应.

     b  同a,是左右侧FPCN dlPFC刺激交互作用.  对比左右侧FPCN dlPFC时,我们发现了显著交互作用效应,

    c 同a,是左侧FPCN dlPFC与V1 刺激部位*时间交互作用.

     

    TMS/fMRI 结果

    图5 rTMS治疗前,患者左侧dlPFC对杏仁核与对右侧dlPFC的抑制作用受到干扰。同步TMS/fMRI对a 左侧FPCNdlPFC 或b 左侧VAN dlPFC 单一TMS脉冲的反应。TMS从ROI中提取,该ROI由静息态fMRI治疗组*时间交互作用效应定位,如图2c。左侧FPCN dlPFC刺激导致健康对照被试杏仁核抑制,但在抑郁症患者中,左侧VAN dlPFC刺激未见异常模式。对于右侧dlPFC 的ROI来说,抑郁患者得到激活,健康被试未见反应。

    上述结果证明,dlPFC与具体下游脑区的神经连接可能是rTMS产生临床效果的基础。那么这些脑区是否也在抑郁症患者的dlPFC中表现异常?为了解决这个问题,我们借助同步TMS/fMRI的优势,检验杏仁核和右侧FPCN ROIs反应。我们再次使用左侧VAN dlPFC点位附近区域,作为空间特异性对照。线性混合模型揭示了刺激点位(FPCN与VAN dlPFC)和被试组(健康与抑郁)的显著相关关系(F=7.50,p=0.007),但与ROI无其他相关(杏仁核与右侧dlPFC),这表明在ROI内也存在类似效应。但是,分别检测每个ROI区域的刺激点位*组别交互作用关系,我们发现在左侧杏仁核(F(1,39) = 5.34, p = 0.026),,右侧dlPFC(F(1,39) = 5.68, p= 0.022)中的显著效应,以及右侧杏仁核趋势(F(1,39) = 3.47, p =0.070)。在健康被试中,FPCN dlPFC刺激引发了杏仁核的负性fMRI反应(失活),右侧dlPFC无变化(图5)。相反,抑郁症患者杏仁核未表现失活,其dlPFC却异常激活。尽管靠近刺激点位,但是上述所有左侧VAN dlPFC刺激后的组间差异均不明显(图5b)。总之,同步TMS/fMRI说明对左侧FPCNdlPFC施加刺激,通常会使得杏仁核失活,但是该效果不存在抑郁症患者中。
     

    讨论        

    为了更好地理解rTMS疗法是如何调节抑郁症中大脑活动的,我们进行了一项随机、假性控制、关注作用机制的临床试验,使用电生理学、神经影像学和rTMS前后的临床变化进行测量,研究结果如下:

    (1)相比伪刺激,有效rTMS增强了dlPFC静息态fMRI中的整体连通性,诱发产生在基线中未表现出的双边杏仁核负性连接,通过全脑功能连接,我们可以预测和追踪临床变化程度;   

    (2)相比伪刺激,有效rTMS抑制了早期TMS激活电位(电位代表皮层抑制,因此表明,rTMS治疗后皮层抑制的减少),位于左侧前额叶和顶叶皮层信号的变化可追踪临床变化程度;   

    (3)在同步TMS/fMRI下,将单一TMS脉冲作用在dlPFC,抑郁症患者未表现出对杏仁核活动的正常抑制。总而言之,这些结果表明,rTMS可产生长时神经调节效果,其特点是降低被认为是局部皮层抑制的电生理指标,恢复了正常的负性dlPFC -杏仁核连接。在解读结果时,我们应考虑到本研究尚存的局限,如小样本,高安慰剂效应比率使得我们很难辨别TMS特异性与非特异性因素,缺少有效刺激/伪刺激治疗组的区分,伪刺激rTMS可能亦存在有效成分的事实,缺乏更复杂的临床样本的普遍适用性(比如rTMS与评估均在实验室条件下,患者无药物服用背景,而在临床情景中,患者常同步使用药物),定位TMS靶点的方法,设备故障使我们无法直接具体验证前期假设,以及其他关于TMS/EEG和fMRI信号背后的生理机制等问题。      

    10Hz rTMS可能能够减少前额叶皮层内抑制,而通过LTP增强兴奋度常被认为是rTMS产生效果的基础,本研究证据表明,rTMS可能是通过减少前额叶皮层内抑制,改善临床抑郁症状的。事实上,rTMS的动物实验认为,该疗法可降低神经元间的活性,减少视觉诱发活动中常见的抑制痕迹。我们发现,10Hz前额叶颅内电刺激可抑制人体颅内p30激活反应。这些研究与本文TMS/EEG结果一致,即rTMS可针对性地抑制受刺激网络中的p30反应。我们观察到,尤其是早期电位变化,刺激部位和治疗分组,所有这些均可控制TMS效果的非特异性。由于其他TMS/EEG电位的神经生理机制比p30更清晰,因此p30的减少可能反映出GABA-Aergic抑制的降低。各层电刺激,人体药理学控制和配对脉冲经颅磁刺激实验均与GABA-Aergic活动有关。      

    因此,rTMS可能通过减少前额叶皮层内抑制而非LTP,诱导神经发育。未来的研究可在大样本基础上验证本研究结果,也可将人类p30结果与动物模型和药理探索联系起来,以阐释关键机制。

     

    dlPFC-杏仁核连接变化

    使用静息态fMRI检测长程连接变化,我们发现有效rTMS能够增强dlPFC全脑功能连接,随之增强dlPFC-杏仁核的负性连接。因此,研究中EEG结果可能意味着dlPFC附近局部抑制的减少,fMRI结果可能表明,由dlPFC到杏仁核的抑制增加。换句话说,如果该结果在未来研究中得到证实,那么rTMS能够增强dlPFC对其他脑区进行自上而下控制的能力,特别是杏仁核。      

    与fMRI结果一致,我们发现,在对左侧dlPFC施加单一TMS脉冲后,健康对照被试左侧杏仁核失活比抑郁被试更加明显。患者杏仁核没有失活,可能有几种情境,包括特异表达的dlPFC-杏仁核耦合,由dlPFC控制的杏仁核激活高基线水平没能有效降低,或是控制机制的转换,如杏仁核从根本上被患者不同的脑区影响等。其他脑区也可能调节功能性连接,而这些脑区可能是解释患者与健康对照差异的基础。

    一些研究认为,重度抑郁(MDD)改变了dlPFC-杏仁核连接,而rTMS可使连接模式标准化,这与我们研究结果一致。前文已说明,rTMS可降低FPCN的超连接,并诱发更强的 dlPFC-DMN 负性连接。已有研究并未设置假性对照实验,所以很难将rTMS效果与伪刺激区分开来。这里我们发现了dlPFC-杏仁核连接改变在有效和伪刺激rTMS中的区别。该疗法增强了两点间的负性连接。未来应进行更多的假性对照研究,以证实本研究结果,并探索认知和情绪功能结果。我们无法重复已有实验,这表明,rTMS弱化了dlPFC和膝下扣带回间的连接。

     

    预测与追踪rTMS的临床反应     

    不论以EEG为基础的p30还是fMRI为基础的整体连通指标,均与HamD量表变化有关。在基线上具有更低dlPFC全脑功能连接的抑郁患者,在rTMS后改善程度更大。此外,fMRI全脑功能连接或p30抑制作用增强越多,临床症状也得到更佳的改善。但是,这些相关关系仅在一小部分对rTMS反应良好的患者身上体现。有趣的是,尽管基准全脑功能连接预测了临床反应,基准dlPFC-杏仁核连接却没有,这说明,有些临床改善可能与其他脑区连接增强有关。另外,值得注意的是,rTMS组中具体的fMRI和TMS/EEG结果不相关,而有效刺激与伪刺激rTMS具有相似的临床效果。这可能反映了伪刺激组的小样本量,或是rTMS神经生理效果并非直接与临床效果相关。最后,本研究在主要组别*时间的脑功能分析中,呈现了中等水平的效果。因此,我们应谨慎解读分析结果,特别是那些关于大脑-临床改善关系的个体间差异研究。未来需要大量本研究,来证实这些大脑-症状关系的外部效度,并探索假性对照组反应的神经基础。为确定脑网络异常连接的原因,还应采用TMS/fMRI分别测量有效刺激vs伪刺激在治疗前后的差异。

     

    请微信搜索“思影科技”关注我们,关注我们的公众号,获得更多精彩脑科学内容,如需原文请添加微信号siyingyxf19962074063

     

     


     

    展开全文
  • 作为菜鸟的我,来到这里开始学习javascript感到非常兴奋啊! 因为js可以实现很多我想实现的页面效果,而这些是我以前只是知道,不知道自己可以怎么写的。 好了,刚才看到宿舍一哥们班的老师上课写的一个图片局部...

      作为菜鸟的我,来到这里开始学习javascript感到非常兴奋啊!

    因为js可以实现很多我想实现的页面效果,而这些是我以前只是知道,不知道自己可以怎么写的。

    好了,刚才看到宿舍一哥们班的老师上课写的一个图片局部放大的js效果,学来了,而且自己改进了很多。

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title></title>
        <style type="text/css">
        #toolbar
        {
            width:300px;
            height:300px;
            position:absolute;
            display:none;
            overflow:hidden;
        }
        </style>
        <script type="text/javascript">
            window.onload = function () {
                var vtoolbar = document.getElementById("toolbar");
                var vsmallImg = document.getElementById("sImg");
                //小图片的鼠标移动事件
                vsmallImg.onmousemove = function () {
    
                    //获取鼠标偏移量
                    var xOffset = event.offsetX;
                    var yOffset = event.offsetY;
    
                    //创建详细图
                    var ImgBar = document.createElement("img");
                    ImgBar.src = this.src; //路径为当前图片路径
    
                    //清空Div
                    if (vtoolbar.innerHTML) {
                        vtoolbar.innerHTML = "";
                    }
                    vtoolbar.appendChild(ImgBar);
                    vtoolbar.style.display = "block";
                    vtoolbar.style.left = event.clientX + 50 + "px";
                    vtoolbar.style.top = event.clientY + 50 + "px";
                    //设置图片偏移量
                    ImgBar.style.marginLeft = -xOffset * 10+100;
                    ImgBar.style.marginTop = -yOffset * 10+100;
                }
                //鼠标离开清空Div
                vsmallImg.onmouseout = function () {
                    //alert("out");
                    vtoolbar.innerHTML = "";
                    vtoolbar.style.display = "none";
                }
            }
        </script>
    </head>
    <body>
    <div id="toolbar"">
    </div>
    <div style="width:100px ; margin:0 auto; margin-top:200px;">
    <img id="sImg" src="images/caoyi.jpg" height="120" width="160"/>
    </div>
    </body>
    </html>
    

     不过还是有很多问题的,比如这里怎么才能自动获取原图片的长宽呢?

    在偏移量的设置时是:局部图片.marginLeft=-1*(鼠标当前偏移量)*倍数+常数;

    这里的倍数是:原始图片/缩略图

    常数是偏移点相对局部图Div的偏移量:Div/2;

    好了,慢慢学习吧~

    加油!

    转载于:https://www.cnblogs.com/dedeyi/archive/2012/07/26/2610712.html

    展开全文
  • 观察兴奋的Bc +状态

    2020-04-20 07:16:17
    使用由LHCb实验在质心... 看到第二种状态,其全局(局部)统计显着性为2.2σ(3.2σ),质量为6872.1±1.3(stat)±0.1(syst)±0.8(Bc +)MeV / c2,与Bc一致 (2S10)+状态。 这些质量测量是迄今为止最精确的。
  • Java 10的局部变量类型推断(JEP 286)增强了Java语言,以将类型推断扩展到使用初始化程序的局部变量声明,这引起了很多人的兴奋。 尽管Java 10已经是老新闻了,但对该功能的热情并未消失。 Nicolai Parlog在有关...

    根据变量推断变量类型

    Java 10的局部变量类型推断(JEP 286)增强了Java语言,以将类型推断扩展到使用初始化程序的局部变量声明,这引起了很多人的兴奋。 尽管Java 10已经是老新闻了,但对该功能的热情并未消失。

    Nicolai Parlog在有关最受欢迎的Java 10功能的采访系列中说:

    Java 8的lambda表达式需要大量的工程时间,并且对Java代码的外观有很大的影响。 Java 9花费了更长的时间,但是代码看起来几乎一样。 Java 10带有局部变量类型推断,即var关键字 ,与lambda和模块系统相比,它是一个非常简单的功能。 从本质上讲,这只是“编译器中的一个小改动”。 但是,如果被广泛采用,它将改变Java代码比lambda表达式更深刻的外观。 让我们看看是否会这样。

    同时,Hazelcast的首席执行官Greg Luck将JEP 286描述为一项功能“所有Scala爱好者都将非常欣赏,因为它允许跳过局部变量和循环的类型声明。” 但是,他还指出,该功能仅限于局部变量和for循环索引。

    这里阅读采访系列。 如果您想了解有关局部变量类型推理如何清除Java详细信息的更多信息,请不要错过Adrian D. Finlay的文章

    解释局部变量类型

    Java SE 10引入了对局部变量的类型推断。 以前,所有局部变量声明都需要在左侧使用显式(清单)类型。 通过类型推断,对于具有初始化程序的局部变量声明,可以用保留的类型名称var替换显式类型。 从初始化程序的类型推断出变量的类型。

    Java局部变量类型推断的样式准则

    您是否阅读了有关局部变量类型推断的样式准则? 如果答案是否定的,则应尽快进行此操作,以了解一些权衡并正确使用var

    如果您仍然不知道何时以及如何使用它,您应该知道Oracle Java语言架构师Brian Goetz最近写了关于此功能的FAQ

    例如,他提到“局部变量仅在声明它们的块中使用,因此编译器可以确保始终在使用它们之前对其进行初始化。” 他强调说,在理解代码时,局部变量的名称和初始值通常比局部变量的类型重要。 他解释说,即使不应该低估类型的重要性也很重要,但“在下一行使用名称的方式可能更重要”。 因此,使用var可以帮助使局部变量声明的重要部分脱颖而出。

    当使用var 而不是类型时,Java编译器将从变量的初始值推断出变量的类型。 这将在类型时派上用场

    • 名字很长
    • 是复杂的参数化类型,或者
    • 如果类型是带有初始值的冗余。

    简而言之,如果您选择使用var ,那么您的代码将更加简洁。 不仅不牺牲可读性,而且在某些情况下,甚至可以通过消除冗余来提高可读性。

    但是,添加var并不能使Java动态类型化:

    使用var ,Java编译器会使用从变量的初始化程序获得的类型信息在编译时推断变量的类型。 然后将推断出的类型用作变量的静态类型。 通常,这与您显式编写的类型相同,因此使用 var 声明的变量的 行为与您显式编写的类型完全相同。

    Brian Goetz

    说到揭穿神话,您还应该知道默认情况下, var 声明的局部变量 是非最终 变量 你可以, 但是 增加final修改器 var 声明

    final var person = new Person();

    请记住,只能 在需要类型推断的地方 使用 var 如果明确声明了类型,则将无法使用它。 即使添加了 val ,它也只能在使用类型推断的地方使用。 “如果明确声明了类型,则无法在Java中使用varval来控制不变性,” Brian解释说。

    var不能用于:

    • 领域
    • 方法参数,以及
    • 方法返回类型

    上面提到的位置中的类型明确显示在类文件以及javadoc规范中。 “通过类型推断,对初始化程序的更改很容易导致变量的推断类型发生更改。 对于局部变量,这不是问题,因为局部变量的范围受到限制,并且它们的类型不会直接记录到类文件中。” 仅当推断出字段,方法参数和方法返回类型的类型时,这才成为问题。

    var可用于:

    • 声明局部变量,
    • 包括for循环的索引变量和
    • try-with-resources语句的资源变量。

    我们几乎没有刮过表面,因此请确保在使用“局部变量类型推断”之前阅读完整的FAQ

    还请参见: Java开发人员想要什么? 项目琥珀和瓦尔哈拉! 他们什么时候想要他们? 当他们准备好了!

    局部变量类型推断(JEP 286)Project Amber的一部分。 它的目标是探索和孵化较小的,面向生产力的Java语言功能,这些功能已被OpenJDK JEP流程接受为候选JEP

    已经交付了两个JEP :一个是JDK 10中交付的JEP 286局部变量类型推断( var ),另一个是JDK 11中交付的针对Lambda参数的JEP 323局部变量语法。

    JEP 301增强枚举已暂停,但这并不意味着该项目将陷入停顿。 相反,目前正在进行一系列的JEP:

    翻译自: https://jaxenter.com/the-dos-and-donts-of-local-variable-type-inference-150683.html

    根据变量推断变量类型

    展开全文
  • 这一结果本身为研究相互作用产生的物质的拓扑状态提供了令人兴奋的可能性,因为我们的新模型与PQED之间的主要区别在于存在非本地的Chern-Simons行为。 确实,对偶变换产生d'Alembertian算符的意外平方根,即(-□)...
  • ELF对线程局部储存的处理(1)

    千次阅读 2011-04-04 19:56:00
    <br />一周之前,...当然这里的描述距离真正的代码实现还很远,不过从中已可窥探出,现代编译器、链接器确实是充满挑战、令人兴奋的软件。   ELF对线程局部储存的处理 原作者:UlrichDrepper,Red

    一周之前,正在为 GCC 中对线程局部变量的处理而头疼不已,偶尔在文档《 Using Gcc 》里找到了这篇“ ELF Handling For Thread -Local Storage ”,它对线程局部变量的描述澄清了我的不少疑问,考虑到尚未看到中文的版本,特把它翻译了出来。当然这里的描述距离真正的代码实现还很远,不过从中已可窥探出,现代编译器、链接器确实是充满挑战、令人兴奋的软件。

     

    ELF 对线程局部储存的处理

    原作者: UlrichDrepper,RedHatInc.

    drepper@redhat.com

    Version 0.20

    December 21, 2005

    基于:

    Intel Itanium Processorspecific Application Binary Interface, May2001, Document Number: 245370-003

    Thread-LocalStorage, Version 0.68, Sun Microsystems, September 4, 2001

    1.      动机

    线程使用的增加导致开发者期望有更好的方式来处理线程局部数据。 POSIX 线程接口定义了,允许独立于每个线程的 void * 对象的,存储。不过这个接口的使用很累赘。在运行时需要为对象分配一个键( key ),如果这个键不再使用就要释放它。这已经是一大堆工作,而且容易出错。在结合了动态加载代码( dynamically loaded code )后,这就成了麻烦的问题( a real problem )。

    为了解决这个问题,最后办法是扩展编程语言,让编译器来接手这个工作。对于 C C++ ,可以在变量的定义及声明中使用新关键字 __thread 。这不是语言的一个正式( official )扩展,但编译器的作者被鼓励实现它们来支持新的 ABI 。以这个方式定义及声明的变量将,在每个线程中,被自动局部地分配:

    __thread int i;

    __thread struct states;

    extern __thread char *p;

    其有用性不局限域用户程序( user-program )。运行时环境亦可以获得好处(比方说,全局变量 errno 必须是线程局部的),而且编译器可以执行那些构建非自动变量( non-autimatic variable )的优化。注意在一个自动变量的定义中,加入 __thread 是不合理的,且不被允许,因为自动变量总是线程局部的。另一方面,函数作用域中的静态变量则是候选者。

    为了实现这个新的特性,运行时环境必须被改变。必须扩展二进制格式,把线程局部变量的定义与普通变量的分开。动态加载器必须能够初始化这些特殊的数据段( data section )。线程库必须被修改,以对新线程分配新的线程局部数据段( thread-local data section )。本文将描述对 ELF 格式的改变,及运行时环境需要做什么。

    当前不是所有具有 ELF 格式的架构都被支持。被支持及在本文中描述的架构有:

               IA-32

               IA-64

               SPARC 32 位及 64 位)

               SuperHitachi SH

               Alpha

               X86-64

               S390 31 位及 64 位)

    HP/PA 64 位的描述等待加入这个文档,其它架构在写这个文档的时刻还没有(完成)支持。

    1 :对于 .tbss .tdata 的段表项( section table entry

    .tbss

    .tdata

    sh_name

    .tbss

    .tdata

    sh_type

    SHT_NOBITS

    SHT_PROGBITS

    sh_flags

    SHF_ALLOC + SHF_WRITE + SHF_TLS

    SHF_ALLOC + SHF_WRITE + SHF_TLS

    sh_add

    段的虚址

    段的虚址

    sh_offset

    0

    初始化映像的文件偏移( file offset of initialization image

    sh_size

    段的大小

    段的大小

    sh_link

    SHN_UNDEF

    SHN_UNDEF

    sh_info

    0

    0

    sh_addralign

    段的对齐量

    段的对齐量

    sh_entsize

    0

    0

    2.      数据定义

    要求发布( emit )线程局部数据对象的改变是最小的。线程局部的数据将出现在 .tdata .tbss 中,而不是分别用于初始化及非初始化数据的 .data .bss 段。这些段就像它们的非线程对手那样定义,而在段的标识( flags )中多设定了一个的标记。用于这些段的段表项如表 1 所示。可以看到,与普通数据段唯一的不同在,于设置了 SHF_TLS 标记。

    这些段的名字,理论上对于 ELF 文件中所有段,是不重要的。取而代之,链接器将把所有设置了 SHF_TLS 标记的 SHT_PROGBITS 类型的段视作 .tdata 段,而把所有设置了 SHF_TLS 标记的 SHT_NOBITS 类型的段视为 .tbss 段。确保其他域符合表 1 的描述,是输入文件作者的责任。

    不同于普通的 .data 段,运行程序是不会直接使用 .tdata 段的。这个段可能在启动期间,由动态链接器通过执行重定位来修改。不过在这之后,这个段的数据被保留为初始化映像( initialization image ),并且不再改变。对于每个线程,包括初始化线程,被分配新的内存,然后拷贝这个初始化映像。这保证了所有的线程都有相同的初始条件。

    因为任何一个线程局部变量符号( any symbol for a thread-local variable )都没有关联的地址,不能使用通常使用的符号表项( symbol table entry )。在执行映像中,域 st_value 将包含变量在运行时的绝对地址;在 DSO 中,这个值将是相对于加载地址的。两者对于 TLS 变量都不可用的。出于这个原因,引入了一个新的符号类型—— STT_TLS 。这个类型的项为所有引用线程局部储存的符号所创建。在目标文件中, st_value 域将包含惯常的,到由 st_shndx 域所引用段开头的偏移。在执行映像及 DSO 中, st_value 域包含了该变量在 TLS 初始化映像中的偏移。

    2 :用于初始化映像的程序头表项

    p_type

    PT_TLS

    p_offset

    TLS 初始化映像的文件偏移( file offset of the TLS initialization image

    p_vaddr

    TLS 初始化映像的虚地址

    p_paddr

    保留未用

    p_filesz

    TLS 初始化映像的大小

    p_memsz

    TLS 初始化映像的总体大小

    p_flags

    PF_R

    p_align

    TLS 初始化映像的对齐量

    允许使用 STT_TLS 符号的,仅是那些被引入来处理 TLS 的重定位。这些重定位不使用其他类型的符号。

    为了允许动态链接器执行这个初始化,初始化映像的位置必须在运行时已知。段头( section header )是不可用的;取而代之,是构建一个新的程序头项( program header entry )。其内容如表 2 所示。

    除了程序头项,其他动态链接器需要的信息是,动态段( dynamic section DT_FLAGS 项中的, DF_STATIC_TLS 标识。这个标识允许拒绝动态加载,以静态模式( static model )创建的模块。下一节将介绍这两个模式。

    每个线程局部变量通过到线程局部储存段(在内存中, .tbss 段遵循对齐要求被直接分配在 .tdata 段后)头的偏移所识别。在链接时刻,没有虚地址可以被计算。这即便对于执行映像亦如是,否则它已经完成了重定位。

    3.      TLS 的运行时处理

    如上面提到的,线程局部储存的处理不像普通数据那么简单。数据段不可以简单地向进程开放。相反要构建多个拷贝,它们都从同一个初始化映像初始化得到。

    另外,运行时支持应该避免构建不必要的线程局部储存。例如,一个加载模块仅被构成进程的多个线程中的一个使用。为所有的线程分配储存,将浪费内存及时间。一个懒惰的方法( lazy method )是被希冀的。这不是个太大的额外负担,因为动态加载对象的处理已经要求识别还未分配的存储。这是唯一可以替代暂停所有线程在它们重新运行前分配储存的做法。

    我们将看到出于性能的原因,不是总能够使用线程局部储存的懒惰分配。至少应用本身及由 DSO 初始加载的线程局部储存总是马上就分配。

    即便分配了内存,使用线程局部储存带来的问题还没完。 ELF 二进制格式定义的符号查找规则不允许,在链接时刻鉴定包含已使用定义的对象。并且如果该对象不是已知的,在线程局部储存段中的,这个对象的偏移亦不可确定。因而通常的链接过程不会发生。

    一个线程局部的变量可以,通过对该对象的一个引用(因而该对象的线程局部储存段),及该变量在这个线程局部储存段的偏移,来识别。为了把这些值映射到实际的虚地址,运行时需要一些现时并不存在的数据结构。它们必须允许把对象的引用映射到,当前线程模块的线程局部储存段的,一个地址( They must allow to map the object reference to an address for the respective thread-local storage section of the module for the current thread )。为此,当前定义了两个版本。不同架构的 ABI 的细节要求两个版本( variant )。 [1]



    [1] 使用版本 II 的一个原因是,出于历史原因,由线程寄存器所指向的内存的布局与版本 I 不兼容。

    它

    用于线程局部储存数据结构的版本 I (见图 1 ),作为 IA-64 ABI 的一部分发展而来。作为崭新的定义,兼容不是问题。用于线程 t 的线程寄存器,由 tpt 表示。它指向一个线程控制块( TCB ),在它偏移为 0 的位置,包含了一个指向该线程的动态线程向量( dynamic thread vector dtvt 的指针。

    动态线程向量在其第一个域包含了一个世代号( generation number gent ,它用于 dtvt 的延迟调整( deferred resizing )及下面描述的 TLS 块的分配。而其它域包含了,指向不同的载入模块的, TLS 块的指针。在启动时刻载入模块的 TLS 块直接跟在 TCB 后,因而具有一个,因架构而异,从线程指针地址开始的,固定偏移。对于所有一开始就存在的模块,在程序启动后,任意 TLS 块到 TCB 的偏移(因而线程局部变量)必须是固定的。

    天

    版本 II 具有相似的结构。唯一的区别在于,线程指针指向一个未指定大小及内容的线程控制块。 TCB 的某处包含了一个指向动态线程向量的指针,但未指出某处是何处。这由运行时环境操控,并且该指针不能被假定为可直接访问;编译器不允许产生直接访问 dtvt 的代码。

    用于执行映像本身,及在启动时加载的所有模块的 TLS 块,都在线程指针所指向地址之下。这允许编译器产生直接访问这块内存的代码。通过动态线程向量访问 TLS 块也是可能的,它具有与版本 I 相同的结构,但它亦相对于线程指针,有在程序启动后即固定的偏移。在链接时刻,执行映像本身的 TLS 数据的偏移是已知的。

    在程序启动时刻,为主线程构建了 TCB 连同动态线程向量。每个模块的 TLS 块的位置,通过使用架构特定的公式,根据各自 TLS 块的尺寸及对齐要求( tlssizex alignx )来计算。在架构特定的段中,该公式将使用一个函数“ round ”,它返回第一个参数取整到其第二个参数整数倍的值:

    round (x, y) = y * x/y

    TLS 块的内存不需要马上就分配。这依赖于模块编译使用的是静态或动态模式,而不管这是否有必要。如果使用的是静态模式,在程序启动时刻,由动态链接器根据重定位来计算地址(更准确些,到线程指针 tpt 的偏移),并且编译器产生,直接使用这些偏移来查找变量地址的,代码。在这个情形下,内存必须被马上分配。在动态模式中,查找变量地址被推迟到一个由运行时环境提供的名为 __tls_get_addr 的函数中。这个函数也可以分配及初始化必要的内存。

    3.1. 启动及之后

    对于使用线程局部储存的程序,启动代码必须在转交控制权之前,为初始线程设置内存。在静态链接的应用中,对线程局部储存的支持是有限的。某些平台(像 IA-64 )没有在 ABI 中定义静态链接(如果支持也不是标准的),其他平台像 Sun ,不鼓励使用静态链接,因为只有有限的功能可用。在任何情况下,在静态链接的代码中,动态加载模块受到很大的限制,甚至是不可能的。因此,处理线程局部储存要简单得多,因为只存在一个模块——执行映像本身。

    在动态链接的代码中,处理线程局部储存则要有趣得多。在这个情形下,动态链接器必须包括对这种数据段处理的支持。动态加载使用线程局部储存的代码所提出的要求,在下一节中描述。

    为了给线程局部储存设立内存,动态链接器从 PT_TLS 程序头项(参见表 2 )获取关于每个模块的线程局部储存的信息。收集所有模块的信息,可以通过一个包含如下内容的记录的链表来处理:

               一个指向 TLS 初始化映像的指针,

               TLS 初始化映像的大小,

               模块的 tlsoffsetm

               显示模块是否使用静态 TLS 模式的标识(仅当架构支持静态 TLS 模式)。

    当动态加载另外的模块时,这个链表可以被延长(参见下一节),并且它将被线程库用来为新创建的线程设置 TLS 块。还有可能合并初始模块集中的两个或更多的初始化记录,以缩短这个链表。

    如果所有的 TLS 内存要在启动时刻分配,其总尺寸将是 tlssizes = tlsoffsetM + tlssizeM ,其中 M 是启动时刻的模块数目。不需要马上分配所有的内存,除非有一个模块是以静态模式编译的。如果所有的模块都使用动态模式,就可能推迟分配。一个优化的实现将不会盲目地追随,显示静态模式使用情况的标志。如果所要求的内存不大,就不值得推迟分配,这样甚至可能节省时间及资源。

    正如在本节开头解释的那样,一个在线程局部储存中的变量,由一个模块的引用及 TLS 块中的偏移所指定。给定动态线程向量数据结构,我们可以把模块引用定义作一个以 1 开始的整数,它可以被用作 dtvt 数组的索引。每个模块接收到的数字由运行时环境决定。只是执行映像本身必须收到一个固定的数, 1 ,并且其他加载的模块接收到的数不相同。

    因此计算一个 TLS 变量的线程特定地址,是一个简单的操作,它可以由编译器使用版本 I 产生的代码来执行。但是遵循版本 II 架构的编译器不能这样做,不这样做也有一个很好的理由:延迟分配(参见下面)。

    作为替代,定义了名为 __tls_get_addr 的函数,理论上它被像这样实现(这是这个函数在 IA-64 上的形式;其它架构可能使用不同的接口):

    void *

    __tls_get_addr (size_t m, size_t offset)

    {

       char *tls_block = dtv [thread_id][m];

       return tls_block + offset;

    }

    如何放置向量 dtv[thread_id] 是特定于架构的。描述 ABI 架构相关部分的章节将给出一些例子。应该把表达式 dtv[thread_id] 视为该进程的一个符号化的表示。 m 是模块 ID ,在该模块(应用本身或一个 DSO )加载的时候,由动态链接器分配。

    使用 __tls_get_addr 函数,还对实现动态模式带来额外的好处,这个模式把 TLS 块的分配推迟到第一次使用。对此,我们只要使用一个特殊的值填写 dtv[thread_id] 向量,这个值能与其它普通的值区分,并且它很可能表示一个空的项。改变 __tls_get_addr 的实现来完成这个额外的工作很简单:

    void *

    __tls_get_addr (size_t m, size_t offset)

    {

       char *tls_block = dtv[thread_id][m];

       if (tls_block == UNALLOCATED_TLS_BLOCK)

          tls_block = dtv[thread_id][m] = allocate_tls (m);

       return tls_block + offset;

    }

    函数 allocate_tls 需要确定模块 m TLS 所要求的内存,并恰当地初始化它。正如第二节所描述的,有两种数据:已初始化及未初始化。当模块 m 被加载时,已初始化的数据必须从重定位后的初始化映像中拷贝。未初始化的数据必须被置为 0 。一个实现可能看起来像这样:

    void *

    allocate_tls (size_t m)

    {

      void *mem = malloc (tlssize[m]);

      memset (mempcpy (mem, tlsinit_image[m], tlsinit_size[m]),

              ‘/0’, tlssize[m] – tlsinit_size[m]);

      return mem;

    }

    tlssize[m] tlsinit_size[m] tlsinit_image[m] 必须以一个依赖于实现的方式来确定。在模块 m 被加载后,它们都是已知的。注意到同样的映像 tlsinit_image[m] 被用于所有的线程,在它们创建的时候。一个线程不从其父亲处继承这个数据。

    存储数据结构的这两个版本都允许使用静态模式。以这个方式编译的模块可以由动态段( dynamic section )的 DT_FLAGS 项的 DF_STATIC_TLS 标志来识别。如果这样的一个模块是初始模块集的一部分(记住,这样的模块不能被动态加载),用于 TLS 块的内存必须马上为启动时刻的初始线程,及为以后每个新创建的线程分配。否则,分配可被推迟,并且把 dtvt 的元素设置为一个由实现定义的值(上面的例子中是 UNALLOCATED_TLS_BLOCK )。

    3.2. 动态加载

    模块的动态加载增加了更多的复杂性。首先,不应该限制,在某一时刻能被加载的,使用线程局部储存的模块数目,这意味着在需要时, dtvt 数组可以被延长。其次,要绝对地避免内存泄露。当优化实现的速度时,必须要牢牢记住这一点。当释放一个被卸载模块的 TLS 块的内存时,浮现了速度问题。动态线程向量中的槽,迟早会被重用的。不这样做意味着,当加载新的模块时,总是延长这个向量。

    因为释放及重新分配内存代价高昂,尤其是必须为每个线程都这样做,通过循环使用内存希望避免这个代价。但是如果同一个模块多次加载、卸载,必须不会导致内存泄露。

    现在实现的限制已经明确了,必须描述需要执行的工作。动态加载包含线程局部储存的模块要求,为应用使用的,使用了这个内存的,当前及将来运行线程,进行准备。注意到加载本身不使用线程局部储存的模块,不管程序余下的部分是否使用线程局部储存,不要求特别的关注。新 TLS 块的信息必须被加入初始化记录链表中,并且增加已加载模块的计数 M 。除了今后被创建的线程,已经在运行的线程也要做准备。

    加载一个新模块可以导致,为给定线程分配的动态线程向量可能太小,这样的结果。这就是每个 dtvt 中的世代计数 gent 所要检测的。如果访问这个向量,首先做的第一件事是确定世代数目是最新的,如果不是,分配一个更大的向量。尽管理论上,这可以由创建新线程的线程(或新线程本身)来完成,但这将导致同步问题,并且如果线程不使用任何线程局部储存,会带来不必要的工作。因为动态加载的模块不能使用静态模式,不需要马上就在 dtvt 中分配新元素。总是可以把分配推迟到第一次的使用,在那里会调用 __tls_get_addr

    3.3. 静态链接的应用

    在静态链接的应用中处理 TLS ,要远比在动态链接的代码中简单。最甚,如果确定静态链接的应用不能动态加载模块。即便在某些环境下允许动态加载的系统中,动态加载可能被局限在加载非常基本的模块,而不允许加载使用或定义了线程局部储存的模块。

    因此静态链接的代码总是只有一个 TLS 块。而且因为仅有一个模块在使用,变量的偏移不是问题。因为所有的线程局部变量都要包含在这个唯一的 TLS 块里,偏移在链接时刻就是已知的。

    链接器总是可以填入模块 ID 、偏移量,并执行代码放宽( code relaxation )。启动代码除了为初始线程设立 TLS 块外,没有其它任务。线程库也为新创建的线程做同样的事情。这是一个简单的任务,因为只有一个初始化映像。

    从这一节的讨论中,我们已经看到访问 TLS 块非常简单,因为 tlsoffset1 的值在链接时刻就知道了,把线程指针, tlsoffset1 的值,及变量偏移相加,就得到变量的地址。对于某些架构,链接器可以通过改写编译器产生的代码,自动地帮助代码改进。在讨论线程局部储存访问模式时,我们将看到代码会得到何等简化。而当讨论链接器放宽( linker relaxation )时,我们将看到链接器如何执行所有需要的优化。

    3.4. 架构特定的定义

    不是所有的架构都使用同一个版本的线程局部储存数据结构,并且某些要求也不同。线程指针的处理是如此的“低级”( low-level ),它本质上是特定于架构的。本节描述这些细节来填补到目前为止讨论的空缺,并且为描述启动代码的工作做准备。

    3.4.1. IA-64 细节

    IA-64 ABI 指定使用上面版本 I 的线程局部储存数据结构。 TCB 的大小是 16 字节,其中前 8 个字节包含了指向动态线程向量的指针。余下 8 个字节保留为实现使用。

    dtvt 的地址可以通过载入由线程寄存器, tp GR 13 )所指向的字 tpt 来确定。 dtvt 每个元素的大小是 8 字节,可以容纳一个指针。

    在启动时刻出现的所有模块(即,那些不能被卸载的模块)的 TLS 块跟在 TCB 后创建。其 tlsoffsetx 的值计算如下:

    tlsoffset1 = round (16, align1 )

    tlsoffsetm+1 = round (tlsoffsetm + tlssizem , alignm+1 )

    对于所有 m ,有 1<= m <= M ,其中 M 是模块的总数。

    函数 __tls_get_addr IA-64 ABI 中的定义如上所描述:

    extern void *__tls_get_addr (size_t m, size_t offset);

    它把模块 ID 及偏移用作参数,这要求重定位改变调用代码以提供需要的信息。

    3.4.2. IA-32 细节

    IA-32 ABI 指定使用版本 II 的线程局部储存数据结构。注意: IA-32 ABI 有两个版本( version )。在这两个模式间数据结构的布局没有不同。对于这两个 ABI 来说, TCB 的大小无关紧要。编译器产生的代码不能直接访问动态线程向量。 dtvt 的每个元素是 4 字节大小,用作一个指针足够了,用于世代计数也足够。

    因为 IA-32 架构的寄存器不多,线程寄存器通过段寄( segment )存器 %gs 间接编码得到。对线程寄存器的唯一要求是:实际的线程指针 tpt 可以通过 %gs 寄存器从绝对 0 地址载入。下面的代码将把线程指针载入 %eax 寄存器:

    movl %gs: 0, %eax

    为了访问使用静态模式模块的 TLS 块,必须知道偏移 tlsoffsetm 。必须从线程寄存器值中减去 这些值。这不同于 IA-64 ,在那里偏移是被加上。这些偏移的计算如下:

    tlsoffset1 = round (tlssize1 , align1 )

    tlsoffsetm+1 = round (tlsoffsetm + tlssizem+1 , alignm+1 )

    对于所有 m ,有 1<= m <= M ,其中 M 是模块的总数。这些公式与 IA-64 的稍有不同,因为这些值是要被减去的。

    函数 __tls_get_addr 同样与 IA-64 的稍有不同。其原型是:

    extern void *__tls_get_addr (tls_index *ti);

    其中类型 tls_index 被定义如下:

    typedef struct

    {

      unsigned long int ti_module;

      unsigned long int ti_offset;

    } tls_index;

    成员名出于解释( presentation )的目的给出。它们在运行时环境外不可用。传递给函数的信息,与这个函数的 IA-64 版本相同,但只需要产生传递一个参数的代码,并且这些值不需要由调用代码从 GOT 载入。相反,这都集中在 __tls_get_addr 中。注意到这个结构体的成员的大小与 GOT 单个项的大小相同。因此这样的一个结构体可以定义在 GOT 上,占据 2 GOT 项。

    这个函数的定义是区分 2 IA-32 ABI 的特征之一。由 Sun Microsystems 定义的 ABI 对这个函数使用传统的 IA-32 调用规范,通过栈传递参数。 GNU 版本的 ABI 则定义通过 %eax 寄存器传递参数。为了避免与 Sun 接口的冲突,这个函数有一个另外的名字(注意前导的 3 个下划线):

    extern void *___tls_get_addr (tls_index *ti)

       __attribute__ ((__regparm__ (1)));

    这个声明使用了 GNU C 编译器的记法。函数本身的差别不是很大,但是链接器操作的复杂性及产生代码的大小则有大的差异, GNU 版本要好些。

    对于在 GNU 系统上的实现,我们可以增加一个要求。 %gs: 0 所代表的地址,实际上就是线程指针。即, %gs: 0 所指向字的内容就是这个字的地址。( The address %gs: 0 represents is actually the same as the thread pointer. I.e., the content of the word addressed via %gs: 0 is the address of the very same location )这个潜在的好处是巨大的,因为我们可以通过 %gs 寄存器直接访问内存,而不需要首先载入线程指针。下面 x86 的初始及局部执行模式( initial and local exec model )的章节显示了这一好处。

    3.4.3. SPARC 细节

    SPARC ABI IA-32 ABI 几乎完全相同。两者都是由 Sun 设计的。 32 位及 64 SPARC 实现的差别在于包含指针的变量的大小不同。

    正如 IA-32 TCB 的结构体没有指定。 %g7 寄存器被用作包含 tpt 的线程寄存器。在线程寄存器的协助下访问动态线程向量的行为由实现定义。 dtvt 每个元素的大小,对于 32 SPARC 4 字节,对于 64 SPARC 8 字节。

    在启动时刻出现的模块的 TLS 块,根据版本 II 的数据结构布局来分配,并且 32 位, 64 位代码都使用相同的公式计算偏移。

    tlsoffset1 = round (tlssize1 , align1 )

    tlsoffsetm+1 = round (tlsoffsetm + tlssizem+1 , alignm+1 )

    对于所有 m ,有 1<= m <= M ,其中 M 是模块的总数。

    函数 __tls_get_addr 具有与 IA-32 相同的接口。其原型是:

    extern void *__tls_get_addr (tls_index *ti);

    其中类型 tls_index 被定义如下:

    typedef struct

    {

      unsigned long int ti_module;

      unsigned long int ti_offset;

    } tls_index;

    这里成员名同样仅出于解释( presentation )的目的给出。它们在运行时环境外不可用。

    因为类型 unsigned long int 32 SPRAC 上是 4 字节,而在 64 SPARC 上是 8 字节, tls_index 的成员,对于两者 CPU ,都与 GOT 项大小相同,因此同样也可以在 GOT 数据结构上定义这个类型的对象。

    3.4.4. SH 细节

    SH ABI Kaz Kojima 按照版本 I 来设计。当前还没有对 64 SH 架构的支持。函数 __tls_get_addr 具有与 SPARC 相同的接口:

    extern void *__tls_get_addr (tls_index *ti);

    其中类型 tls_index 被定义如下:

    typedef struct

    {

      unsigned long int ti_module;

      unsigned long int ti_offset;

    } tls_index;

    这里成员名如常仅出于解释( presentation )的目的给出。它们在运行时环境外不可用。

    当前所支持的 SH ABI 的细节,因为处理器架构的原因,不同于 SPARC IA-32 IA-64 的代码。在 SH-5 之前的处理器仅提供非常受限的取址模式,它仅允许最多 12 位的偏移。因为编译器不能对函数的大小及布局做任何假定(因而符号的相对位置),对象及函数的地址通常不能在运行时计算(译:似乎应该是编译时刻)。相反,地址被保存在变量中,在加载时刻,由运行时链接器计算这些值。这只需要为数据对象定义重定位类型。因为仅需要少数新的重定位类型,这极大地简化了 TLS 的处理。

    访问 TLS 的代码序列是固定的。指令调度不被允许。在今天的 SH 实现中,这已不再需要,因为它们不再突出( feature )复杂的乱序执行( out-of-order execution )。

    3.4.5. Alpha 细节

    Alpha ABI IA-64 SPARC ABI 的混合体。其线程局部储存数据结构,遵循上面的版本 I TCB 的大小是 16 字节,其中前 8 个字节包含了指向动态线程向量的指针。余下 8 个字节保留为实现使用。

    在启动时刻出现的所有模块(即,那些不能卸载的)的 TLS 跟在 TCB 后连续构建。其 tlsoffsetx 的值计算如下:

    tlsoffset1 = round (16, align1 )

    tlsoffsetm+1 = round (tlsoffsetm + tlssizem , alignm+1 )

    对于所有 m ,有 1<= m <= M ,其中 M 是模块的总数。

    函数 __tls_get_addr 如为 SPARC 定义的那样:

    extern void *__tls_get_addr (tls_index *ti);

    线程指针被保存指针线程的进程控制块中。这个值通过 PALcode 的入口点 PAL_rduniq 来访问。

    3.4.6. x86-64 细节

    x86-64 ABI IA-32 ABI 几乎完全相同。差别主要在于,包含指针变量的不同的大小,并且只有一个更接近 IA-32 GNU 版本的版本。

    它使用 %fs 段寄存器,而不是 %gs 段寄存器。在线程寄存器的协助下,访问动态线程向量的行为,由实现定义。 dtvt 每个元素的大小是 8 字节。

    在启动时刻出现的所有模块的 TLS 块,根据版本 II 的数据结构布局来分配,并使用相同的公式计算偏移。

    tlsoffset1 = round (tlssize1 , align1 )

    tlsoffsetm+1 = round (tlsoffsetm + tlssizem+1 , alignm+1 )

    对于所有 m ,有 1<= m <= M ,其中 M 是模块的总数。

    函数 __tls_get_addr 具有与 IA-32 相同的接口。其原型是:

    extern void *__tls_get_addr (tls_index *ti);

    其中类型 tls_index 被定义如下:

    typedef struct

    {

      unsigned long int ti_module;

      unsigned long int ti_offset;

    } tls_index;

    这里成员名同样仅出于解释( presentation )的目的给出。它们在运行时环境外不可用。

    3.4.7. s390 细节

    s390 ABI 使用版本 II 的线程局部储存数据结构。对于这个 ABI TCB 的大小无关重要。线程指针保存在访问寄存器 %a0 里,在能作为地址使用前,需要被提取入一个通用寄存器。从 %a0 获取线程指针到,比如, %r1 的一个方法是使用 ear 指令:

    ear %r1, %a0

    在启动时刻出现的所有模块的 TLS 块根据版本 II 的数据结构的布局来分配,并且使用相同的公式计算偏移。 tlsoffseti 的值必须从线程寄存器的值中减去。

    tlsoffset1 = round (tlssize1 , align1 )

    tlsoffsetm+1 = round (tlsoffsetm + tlssizem+1 , alignm+1 )

    对于所有 m ,有 1<= m <= M ,其中 M 是模块的总数。

    S390 ABI 定义使用函数 __tls_get_offset ,而不是其它 ABI 所使用的函数 __tls_get_addr 。其原型是:

    unsigned long int __tls_get_offset (unsigned long int offset);

    这个函数具有隐藏的第二个参数。调用者需要设立 GOT 寄存器 %r12 ,来包含调用者模块的全局偏移表( global offset table )的地址。参数 offset ,当加上 GOT 寄存器的值时,得到,位于调用者的全局偏移表中的, tls_index 结构体的地址。类型 tls_index 被定义如下:

    typedef struct

    {

      unsigned long int ti_module;

      unsigned long int ti_offset;

    } tls_index;

    __tls_get_offset 的返回值是线程指针的一个偏移。为了得到所要求的变量的地址,线程指针需要加上返回值。 __tls_get_offset 的使用看起来似乎比标准的 __tls_get_addr 更复杂,但是对于 s390 ,使用 __tls_get_offset 产生更好的代码序列。

    3.4.8. s390x 细节

    s390x ABI 非常接近于 s390 ABI 。线程局部储存数据结构遵循版本 II 。对于这个 ABI 来说, TCB 的大小无关紧要。线程指针被保存在访问寄存器对( access register pair %a0 %a1 中,其中线程指针的高 32 位在 %a0 里,低 32 位在 %a1 中。把线程指针获取入,比如寄存器, %r1 的一个方法是使用下面的指令序列:

    ear %1, %a0

    sllg %r1, %r1, 32

    ear %r1, %a1

    在启动时刻出现的所有模块的 TLS 块,使用与 s390 相同的公式计算 tlsoffsetm ,并且 s390x ABI 使用与 s390 相同的 __tls_get_offset 接口。

    展开全文
  • 这种方法在量子引力的讨论中,特别是在弦理论中的黑洞,局部有效场理论的非局域性和分解以及宇宙超弦及其现象学相关性的讨论中,也将是有用的。 我们还将讨论弦论中波/质(或波/弦)对偶性的表现。
  • 可以在此下载代码: • C20.exe (164KB) 热衷于 C# 语言的人会喜欢上 Visual C# 2005。Visual Studio 2005 为 Visual C# 2005 带来了大量令人兴奋
  • 我们与11位Java专家讨论了他们最喜欢的功能和Java 10的“独特销售主张”,并且我们了解到,即使Java 10并不是那么特别,人们还是对局部变量类型推断(JEP 286)感到非常兴奋,它可以增强Java一种语言,用于将类型...
  • 神经网络中最基本的单位是神经元模型,在生物神经网络中,每个神经元与其他神经元相连,当“兴奋”时,就会向相连的神经元发送化学物质,改变神经元内电位,若超过了某个“阈值”,那么它就会被激活,即“兴奋”起来...
  • 西瓜书读书笔记——第五章:神经网络5.1 神经元模型5.2 感知机与多层网络5.2.1 感知机5.3 误差逆传播算法5.4 全局最小与局部极小 5.1 神经元模型 在生物神经网络中,每个神经元与其他神经元相连,当某个神经元兴奋...
  • Batch Normalization

    2020-07-08 15:39:33
    LRN(Local Response Normalization)...应用到深度神经网络中,这种横向抑制的目的是进行局部对比度增强,以便将局部特征在下一层得到表达。 假设取n为3,现在计算(x, y, i)位置上LRN的值,便可以(x, y, i)为中心,
  • Dotnetnuke的AJAX问题

    千次阅读 2007-08-14 21:46:00
    DNN在Ajax上支持了很多,最著名的动作就是在模块定义上增加了Supports Partial Rendering,可以支持局部刷新。如果勾选了这个标志位,DNN...兴奋之余,却发现模块中AddModuleMessage不起作用了,无论如何都不能显示错
  • 2020年8月3日,中国科学...这项工作利用光遗传技术,通过同步激活小鼠不同皮层区域的神经元细胞群,发现大量神经元群被重复激活会造成局部和全脑皮层神经元兴奋性增强的现象。这种增强效应需要大脑皮层同一区域或者...
  • 2020年8月3日,中国科学院...这项工作利用光遗传技术,通过同步激活小鼠不同皮层区域的神经元细胞群,发现大量神经元群被重复激活会造成局部和全脑皮层神经元兴奋性增强的现象。这种增强效应需要大脑皮层同一区域或...
  • 文章目录药理学基本介绍药物作用的基本规律几个基本概念药物毒物药物作用药物效应兴奋抑制基本任务药物作用作用方式局部作用与全身作用(范围)局部作用全身作用直接作用和间接作用(方式)直接作用间接作用选择性两重性...
  • 睡眠时大脑皮层的兴奋过程降低,体内分解代谢处于最低水平,而合成代谢过程则相对较高,有利于体内能量的蓄积。成年运动员在平时训练期间,每天应有8一9小时的睡眠。在大运动量和比赛期间,睡眠时间应适当延长。青...
  • 冬天如何养胃

    2008-12-09 08:22:30
    冬天天冷人的交感神经兴奋,血管易于收缩。对于胃部而言,血管收缩的结果是,局部抵抗力变弱,胃粘膜的屏障被破坏,诱发胃及十二指肠溃疡、出血。所以天冷是胃部出血的高发季节。 对于胃部疾病总的原则是:三分治,...
  • 盆腔炎治疗仪,利用物理的电、热、磁等生理作用,促进人体神经肌肉组织兴奋局部血液循环,并有镇痛作用。盆腔治疗仪对盆腔炎的治疗,具有无副作用和后遗症等优点,在妇科中得到广泛的应用。因为在治疗过程中...
  • “ Java 10对Java 9来说是一个相当小的更新 ”Java 10 发布了一周后,我们仍在分析其最重要的特性(就是它-局部变量类型推导)。令人兴奋的新特性无疑更让人思考我们了解到即使Java 10并不特别,人们对Local-variable...
  • 这是首次报道的嘌呤生物碱茶碱的概念密度泛函理论(DFT)研究,以及与密切相关的兴奋性咖啡因的量子化学性质的比较。 使用Spartan '16软件计算了两种化合物的DFT总体化学反应性描述符(化学硬度/柔软度,化学势/电负...
  • 机器学习之神经网络

    2018-10-26 11:44:50
    全局最小与局部最小5.深度学习 1.神经元模型 神经元 neurou 模型 神经科学中神经元图片: 个人理解:机器学习的本质是对大量数据的利用,即将大量的数据压缩为可以直接使用的知识与规律,而神经元模型恰好能...
  • 建筑专业实习日记范文8篇 实习除了要写实习报告实习总结以外,还要写实习日的。那么实习日记怎么写?下面是小编精心整理的建筑实习日记,... 我们一边实地勘察,一边讨论整个测量流程,采用先整体后局部的原则,先踏...
  • 这个问题困扰了我好一阵子(就在上次去福州前还被折磨得半死,后来发现是JSP里粗心少打了个p_comp只打com``好晕)~~今天弄出来了,实在是有点小兴奋~采取的是优秀的局部配置,步骤如下: 到你应用程序所在目录(我的...
  • 盆腔炎治疗仪,利用物理的电、热、磁等生理作用,促进人体神经肌肉组织兴奋局部血液循环,并有镇痛作用。盆腔治疗仪对盆腔炎的治疗,具有无副作用和后遗症等优点,在妇科中得到广泛的应用。因为在治疗过程中需要...
  • 感受emacs-snapshot!

    千次阅读 2006-04-29 22:38:00
    兴奋的在debian的unstable源中发现了emacs-snapshot,这可是好东东啊,最近刚更新过,i386版本是更新的!二话不说,安装,是22.0.50.1,传说中的unicode版本,打开一试,果然自动支持中文显示,用scim输入中文更是...
  • 此次A股行情不足一个月反弹回落,说明市场已度过政策“微调”与期待证监会换届新政的兴奋期,行情涨跌又需要寻找新的刺激性因素。现阶段左右行情的因素中,投资者在政策的局部性“微调”与经济系...

空空如也

空空如也

1 2 3
收藏数 49
精华内容 19
关键字:

局部兴奋