小编tom*_*omd的帖子

使用With对比绘图使用Block(Mathematica)绘图

我想描述我一直有一个问题与Plot使用With,以保持定义的参数"本地".我不一定要求解决问题:我遇到的问题是理解问题.

有时候我使用如下的结构来获得一个Plot:

方法1

plot1 = With[{vmax = 10, km = 10}, 
  Plot[Evaluate@((vmax x)/(km + x)), {x, 0, 100}, 
   AxesOrigin -> {0, 0}]]
Run Code Online (Sandbox Code Playgroud)

我喜欢这种方法,即使对于非Mathematica用户来说,它也是相当清楚的.

当要绘制的方程式变得更加复杂时,我喜欢在绘图外部定义它们(使用SetDelayed).例如:

f[x_] := (vmax x)/(km + x)
Run Code Online (Sandbox Code Playgroud)

但是,以下不起作用

方法2

plot2 = With[{vmax = 10, km = 10}, 
  Plot[Evaluate@f[x], {x, 0, 100}, AxesOrigin -> {0, 0}]]
Run Code Online (Sandbox Code Playgroud)

我一直天真地认为它应该.但是,基于Help语句

Plot将变量x视为本地,有效地使用Block

我使用过各种解决方法,大多数情况如下

方法3

plot3 = Plot[With[{vmax = 10, km = 10}, Evaluate@f[x]], {x, 0, 100}, 
  AxesOrigin -> {0, 0}]
Run Code Online (Sandbox Code Playgroud)

这个看起来很尴尬,甚至通常需要对Mathematica用户进一步解释.

绘图输出

在此输入图像描述

但是,最近我发现偶然的机会,取代 …

wolfram-mathematica

28
推荐指数
1
解决办法
3679
查看次数

'StringCut'使用Mathematica在定义位置的左侧或右侧

在阅读这个问题时,我认为以下问题很简单StringSplit

给定以下字符串,我想在每个"D"的左侧"剪切"它,以便:

  1. 我得到一个片段列表(序列不变)

  2. StringJoin@fragments返回原始字符串(但如果我必须重新排序片段以获得此字符串,则无关紧要).也就是说,每个片段中的序列很重要,我不想丢失任何字符.

(我感兴趣的例子是蛋白质序列(字符串),其中每个字符代表一个字母代码中的氨基酸.我想获得通过用已知在"D"之前分裂的酶处理获得的所有片段的理论列表. )

str = "MTPDKPSQYDKIEAELQDICNDVLELLDSKGDYFRYLSEVASGDN"
Run Code Online (Sandbox Code Playgroud)

我能想到的最好的是在每个"D"之前插入一个空格StringReplace然后使用StringSplit.至少可以说,这似乎很尴尬.

frags1 = StringSplit@StringReplace[str, "D" -> " D"]
Run Code Online (Sandbox Code Playgroud)

作为输出:

{"MTP", "DKPSQY", "DKIEAELQ", "DICN", "DVLELL", "DSKG", "DYFRYLSEVASG", "DN"}
Run Code Online (Sandbox Code Playgroud)

或者,使用StringReplacePart:

frags1alt = 
 StringSplit@StringReplacePart[str, " D", StringPosition[str, "D"]]
Run Code Online (Sandbox Code Playgroud)

最后(更现实地),如果我想在"D"之前分裂,前提是它前面的残留物不是"P"[即PD,(Pro-Asp)键未被切割],我这样做:

StringSplit@StringReplace[str, (x_ /; x != "P") ~~ "D" -> x ~~ " D"]
Run Code Online (Sandbox Code Playgroud)

有更优雅的方式吗?

速度不一定是个问题.我不太可能处理大于500个字符的字符串.我正在使用Mma 7.

更新

我添加了生物信息学标签,我认为从该领域添加一个例子可能会引起兴趣.

以下使用eutilsNCBI数据库中导入蛋白质序列(牛血清白蛋白,登录号3336842),然后产生(理论上的)胰蛋白酶消化物.假设A2不是"R","K"或"P",我认为当A1是"R"或"K"时,酶tripin在残基A1-A2之间切割.如果有人有任何改进建议,请随时提出修改建议.

使用sakra方法的修改('db ='之后的回车可能需要删除):

StringJoin /@ 
   Split[Characters[#], 
    And @@ Function[x, …
Run Code Online (Sandbox Code Playgroud)

string wolfram-mathematica bioinformatics

9
推荐指数
2
解决办法
337
查看次数

更改GraphPlot中的边缘路径以避免歧义

我有以下无向图

gr={1->2,1->3,1->6,1->7,2->4,3->4,4->5,5->6,5->7};
Run Code Online (Sandbox Code Playgroud)

我想用GraphPlot以'菱形'格式绘制.我这样做如下所述(方法1)给出以下内容:

替代文字

问题是这种表示具有欺骗性,因为顶点4和1或1和5之间没有边缘(边缘是4到5).我希望改变边缘{4,5}的路线,得到如下内容:

替代文字

我通过包含另一条边{5,4}来做到这一点,现在我可以使用MultiedgeStyle来"移动"有问题的边缘,然后通过定义EdgeRenderingFunction来消除添加的边缘,从而不显示有问题的线条.(方法2,'解决方法').至少可以说这很尴尬.有没有更好的办法?(这是我的第一个问题!)

方法1

gr={1->2,1->3,1->6,1->7,2->4,3->4,4->5,5->6,5->7};

vcr={1-> {2,0},2-> {1,1},3-> {1,-1},4-> {0,0},5-> {4,0},6-> {3,1},7-> {3,-1}};

GraphPlot[gr,VertexLabeling-> True, 
             DirectedEdges-> False,
             VertexCoordinateRules-> vcr, 
             ImageSize-> 250]
Run Code Online (Sandbox Code Playgroud)

方法2(解决方法)

erf= (If[MemberQ[{{5,4}},#2], 
         { },      
         {Blue,Line[#1]}
        ]&);

gp[1] = 
       GraphPlot[
                 Join[{5->4},gr], 
                        VertexLabeling->True, 
                        DirectedEdges->False, 
                        VertexCoordinateRules->vcr, 
                        EdgeRenderingFunction->erf, 
                        MultiedgeStyle->.8, 
                        ImageSize->250
                        ]
Run Code Online (Sandbox Code Playgroud)

wolfram-mathematica

7
推荐指数
1
解决办法
377
查看次数

用Mathematica改变矩阵的对角线

有没有一种优雅的方法可以将矩阵的对角线更改为新的值列表,相当于Band with SparseArray?

说我有以下矩阵(见下文)

(mat = Array[Subscript[a, ##] &, {4, 4}]) // MatrixForm
Run Code Online (Sandbox Code Playgroud)

并且我想将主对角线改为以下以获得"新垫子"(见下文)

newMainDiagList = Flatten@Array[Subscript[new, ##] &, {1, 4}]
Run Code Online (Sandbox Code Playgroud)

我知道使用ReplacePart将主对角线更改为给定值很容易.例如:

ReplacePart[mat, {i_, i_} -> 0]
Run Code Online (Sandbox Code Playgroud)

我也不想局限于主对角线(与Band不受SparseArray限制的方式相同)

(我现在使用的方法如下!)

(Normal@SparseArray[Band[{1, 1}] -> newMainDiagList] + 
   ReplacePart[mat, {i_, i_} -> 0]) // MatrixForm
Run Code Online (Sandbox Code Playgroud)

(期望输出是'新垫')

替代文字

wolfram-mathematica

6
推荐指数
1
解决办法
1774
查看次数

订购@订购和排名排列

正如nazdrovje(参见此处)所指出的,Ordering@Ordering可用于获得列表中每个元素的等级.即使列表包含重复的元素,结果也是一个n -permutation(作为整数1到n的有序列表而没有重复),其中排名最低的元素被赋值为1,第二个最低的元素为2,等等.正如Andrzej所指出的那样.Kozlowski,以下成立(另见此处):

(Sort@mylist)[[Ordering@Ordering@mylist]]==mylist
Run Code Online (Sandbox Code Playgroud)

我想产生一个排名排列,其中排名最高的元素被分配1,第二个最高的 2等,以便以下成立:

(Reverse@Sort@mylist)[[newPermutation]]==mylist
Run Code Online (Sandbox Code Playgroud)

这看起来很简单,但我只能提出一个非常尴尬的解决方案.目前我做了以下事情:

newPermutation= Ordering@Ordering[Ordering@Ordering@mylist,All,Greater]
Run Code Online (Sandbox Code Playgroud)

有更优雅,更直观的方式吗?肯定一定有吗?

一个例子:

mylist= {\[Pi],"abc",40,1, 300, 3.2,1};

Ordering@Ordering@mylist

Ordering@Ordering[Ordering@Ordering@mylist,All,Greater]
Run Code Online (Sandbox Code Playgroud)

输出(注意排列之间的相互关系)

{7,6,4,1,5,3,2}
{1,2,4,7,3,5,6}
Run Code Online (Sandbox Code Playgroud)

(以下两个评估为True)

Sort@mylist)[[Ordering@Ordering@mylist]]== mylist
Reverse@Sort@mylist)[[ Ordering@Ordering[Ordering@Ordering@mylist,All,Greater]]]== mylist
Run Code Online (Sandbox Code Playgroud)

wolfram-mathematica

6
推荐指数
1
解决办法
534
查看次数

GraphPlot Graphic中的VertexCoordinate规则和VertexList

是否有任何方法可以从GraphPlot生成的图形的(FullForm或InputForm)中抽象出GraphPlot应用于VertexCoordinate规则的顶点顺序?我不想使用GraphUtilities函数VertexList.我也知道GraphCoordinates,但这两个函数都适用于图形,而不是GraphPlot的图形输出.

例如,

gr1 = {1 -> 2, 2 -> 3, 3 -> 4, 4 -> 5, 5 -> 6, 6 -> 1};
gp1 = GraphPlot[gr1, Method -> "CircularEmbedding", 
   VertexLabeling -> True];

Last@(gp1 /. Graphics[Annotation[x___], ___] :>  {x})
Run Code Online (Sandbox Code Playgroud)

给出以下六个坐标对的列表:

VertexCoordinateRules - > {{2.,0.866025},{1.5,1.723205},{0.5,1.723205},{0.,0.866025},{0.5,1.3349*10 ^ -10},{1.5,0.}}

我如何知道哪个规则适用于哪个顶点,我可以确定这与VertexList [gr1]给出的规则相同吗?

例如

 Needs["GraphUtilities`"];
gr2 = SparseArray@ 
      Map[# -> 1 &, EdgeList[{2 -> 3, 3 -> 4, 4 -> 5, 5 -> 6}]];

    VertexList[gr2]
Run Code Online (Sandbox Code Playgroud)

给出{1,2,3,4,5}

但......

    gp2 = GraphPlot[gr2, VertexLabeling -> True, 
      VertexCoordinateRules -> 
       Thread[VertexList[gr1] -> …
Run Code Online (Sandbox Code Playgroud)

wolfram-mathematica

5
推荐指数
2
解决办法
2235
查看次数