我正在尝试修复BodePlot的Phase plot部分,因为它没有正确包装.我没有选择告诉它包装.
所以,而不是自己做完整的情节,(我可以这样做,如果我必须)我想首先制作BodePlot,抓住数据点,对数据进行包装(一旦我得到x,y数据,其余的很简单),然后我需要将新的点列表放回到图中,然后使用Show来显示它.
我坚持的部分是从FullForm中提取点.我无法得到正确的模式来做到这一点.
这就是我到目前为止所做的事情:
hz=z/(z^2-z+0.3);
tf=TransferFunctionModel[hz,z,SamplingPeriod->2];
phasePlot=BodePlot[tf,{0.001,2 Pi},
ScalingFunctions->{Automatic,{"Linear","Degree"}},PlotLayout->"List"][[2]]
Run Code Online (Sandbox Code Playgroud)
你看它怎么不包裹在180度.在博士阶段情节包装中,在dsp中更为常见.这是'应该'的样子:
所以,这就是我做的:
FullForm[phasePlot]
Graphics[List[
List[List[], List[],
List[Hue[0.67, 0.6, 0.6],
Line[List[List[0.0010000243495554542, -0.2673870119911639],
List[0.0013659538057574799, -0.36521403872250247],
List[0.0017318832619595053, -0.46304207336414027],
....
Run Code Online (Sandbox Code Playgroud)
我看到那里的数据(x,y)但是如何将它们拉出来?我试过这个:
Cases[FullForm[phasePlot], List[x_, y_] -> {x, y}, Infinity];
Run Code Online (Sandbox Code Playgroud)
但上面的匹配除了点列表,其他我不需要的东西.我尝试了很多其他的东西,但不能只得到点列表.
我想知道是否有人知道如何从上面的图中仅拉出(x,y)点.除了使用FullForm之外,还有更好的方法吗?
谢谢
更新:
我在这里找到一篇文章,展示如何从绘图中提取数据.所以我用它:
points = Cases[Normal@phasePlot, Line[pts_] -> pts, Infinity]
Run Code Online (Sandbox Code Playgroud) (Mathematica版本:8.0.4,在Windows 7上)
有人可以提醒我如何告诉M在以下情况下不要更改ImageSize:
我有一个Manipulate,我制作一个网格,在网格内部,我要么显示一个图,要么显示2个图,具体取决于控件的选择.
为了保持整体显示的图像相同,如果我显示一个图我使用一个尺寸,如果我显示2个图,我使用每个图的一半长度.到目前为止很容易.
奇怪的是,当我使用鼠标旋转一个绘图案例,然后切换回2个绘图时,绘图大小现在不使用我指定的ImageSize.
似乎通过使用鼠标旋转一个绘图,它影响了同一屏幕位置上显示的下一个绘图.
使用SphericalRegion -> True
与否,没有效果.使用RotationAction -> "Fit"
没有效果.
这是我的意思的一个小例子,然后我展示了我目前如何解决这个问题.但我通过使用GraphicsGrid代替Grid来解决它.如果可能的话,我想继续使用Grid.
Manipulate[
Module[{opt = {Spacings -> {0, 0}, Frame -> All}, p,
size, data = Table[RandomReal[], {10}, {10}], wid = 300, len = 300},
size = If[choice == 1, {wid, len}, {wid, len/2}];
Print[size];
p = ListPlot3D[data,SphericalRegion->True,ImagePadding -> 10,ImageSize ->size];
If[choice == 1,
Grid[{{p}}, Sequence@opt], Grid[{{p}, {p}}, Sequence@opt]
]
],
Row[{SetterBar[Dynamic[choice], {1, 2}]}],
{{choice, 2}, None}
]
Run Code Online (Sandbox Code Playgroud)
要重现这个问题,很简单:首先我要注意尺寸,这就是我想保留它的方式.现在我点击选项1,现在使用鼠标旋转一个图.现在我点击选择2返回,然后我看到情节大小不是我预期的.
我确信这是我需要使用的选项.还没找到它.
PS.实际上似乎发生的是,旋转的SAME图,停留在内容区域,并用于代替第二种情况下的2个图中的一个.很奇怪.我必须在某个地方做些傻事,因为这太奇怪了.
更新2:48 am …
我正在使用Mathematica 7来处理大型数据集.数据集是有符号整数的三维数组.这三个级别可以被认为对应于每个镜头的X个点,每个扫描的Y个镜头和每个组的Z个扫描.
我还有一个"归零"镜头(包含X点,它是整数的有符号分数),我想从数据集中的每个镜头中减去.之后,我将永远不再需要原始数据集.
如何在不创建数据集的新副本或部分数据集的情况下执行此转换?从概念上讲,数据集位于内存中,我想扫描每个元素,并在内存中的该位置进行更改,而不会将其永久复制到其他内存位置.
以下自包含代码捕获了我尝试执行的所有方面:
(* Create some offsetted data, and a zero data set. *)
myData = Table[Table[Table[RandomInteger[{1, 100}], {k, 500}], {j, 400}], {i, 200}];
myZero = Table[RandomInteger[{1, 9}]/RandomInteger[{1, 9}] + 50, {i, 500}];
(* Method 1 *)
myData = Table[
f1 = myData[[i]];
Table[
f2 = f1[[j]];
f2 - myZero, {j, 400}], {i, 200}];
(* Method 2 *)
Do[
Do[
myData[[i]][[j]] = myData[[i]][[j]] …
Run Code Online (Sandbox Code Playgroud) 我之前没有使用过PackedArray,但是今天就开始考虑使用它们来阅读它们.
我所拥有的是所有实数的大尺寸1D和2D矩阵,没有符号(它是有限差分PDE求解器),所以我认为我应该利用PackedArray.
我有一个初始化函数,我分配所需的所有数据/网格.所以我去ToPackedArray
了他们.它似乎更快一点,但我需要做更多的性能测试,以更好地比较前后的速度,并比较RAM的使用情况.
但是当我看到这个时,我注意到M中的一些操作已经自动返回PackedArray中的列表,而有些则没有.
例如,这不会返回打包数组
a = Table[RandomReal[], {5}, {5}];
Developer`PackedArrayQ[a]
Run Code Online (Sandbox Code Playgroud)
但这样做
a = RandomReal[1, {5, 5}];
Developer`PackedArrayQ[a]
Run Code Online (Sandbox Code Playgroud)
这样做
a = Table[0, {5}, {5}];
b = ListConvolve[ {{0, 1, 0}, {1, 4, 1}, {0, 1, 1}}, a, 1];
Developer`PackedArrayQ[b]
Run Code Online (Sandbox Code Playgroud)
并且矩阵乘法确实在打包数组中返回结果
a = Table[0, {5}, {5}];
b = a.a;
Developer`PackedArrayQ[b]
Run Code Online (Sandbox Code Playgroud)
但元素乘法不是
b = a*a;
Developer`PackedArrayQ[b]
Run Code Online (Sandbox Code Playgroud)
我的问题:是否有一个列表哪个文件哪个M命令返回PackedArray而不是?(假设数据符合要求,例如Real,不混合,没有符号等.)
另外,一个小问题,你认为在调用ToPackedArray
它之前首先检查创建的列表/矩阵是否已经打包会更好吗?我认为呼叫ToPackedArray
已经打包的列表不会花费任何费用,因为呼叫将立即返回.
谢谢,
更新(1)
只是想提一下,刚发现在演示CDF中不允许使用PackedArray符号,因为我在上传一个时遇到错误.所以,不得不删除我的所有包装代码.由于我主要编写演示,现在这个主题对我来说只是学术兴趣.但是要感谢大家的时间和好的答案.
我想尝试使用Ruby来完成我在Python中所做的事情.在Python中,它具有r"""
支持原始字符串的语法,这很好,因为它允许原始字符串与代码一致,并以更自然的方式连接它们,并且不需要特殊的缩进.在Ruby中,当使用原始字符串时,必须使用<<'EOT'
后面的EOT
单独行来打破代码布局.
您可能会问,为什么不使用Ruby %q{}
?好吧,因为%q{}
它与Python相比有局限性,因为r"""
它不会逃避多个\\\
并且只处理单个\
.
我正在动态生成Latex代码并写入一个文件,后来用pdflatex编译.Latex代码包含\\\
许多地方的内容.如果我使用Ruby的%q{}
语法,那么它将无法工作.所以我必须使用Ruby,<<'EOT'
但我不想这样做,因为它使得代码更难以在Ruby源文件中读取,因为必须打破它才能让缩进变得EOT
快乐.
我问是否有一种方法可以使语法类似于%q{}
,或者某些函数接受字符串并返回相同的结果,就像使用了一样EOT
,处理原始字符串而不受限制EOT
.
我不需要插值.所以单引号字符串.没有双引号.双引号导致插值,我不想要.
这是Python中的一个小例子,然后我展示了我必须在Ruby中做什么来生成相同的输出.
my_file = open("py_latex.tex", 'w')
x = r"""\\\hline is a raw string"""+r""" another one \\\hline and so on"""
my_file.write(x)
Run Code Online (Sandbox Code Playgroud)
当我打开上面写的Latex文本文件时,我看到了正确的结果
现在在Ruby中做同样的事情.我不能写下面的内容(即使我愿意)
file = File.open('rb_latex.tex','w')
x=%q{\\\hline is a raw string}+%q{ another one \\\hline and so on}
file.write(x)
Run Code Online (Sandbox Code Playgroud)
以上所说的不是我想要的.当它写入latex文件时,它显示为
使用EOT
作品,如下 …
我无法得到我想要的语法,我现在不确定它是否可能.
小评:一个人可以这样做:
{Slider[Dynamic[b], {-2 Pi, 2 Pi}], Dynamic[Sin[b]]}
Run Code Online (Sandbox Code Playgroud)
现在每次滑块移动时,'b'都会改变,并且会自动打印它的Sin []
但是假设我想直接在滑块所在的位置进行计算(Sin [])并且只显示Sin []的最终结果,那么我可以像这样使用Dynamic的第二个参数:
{Slider[Dynamic[b, (b = #; a = Sin[b]; #) &], {-2 Pi, 2 Pi}],
Dynamic[a]}
Run Code Online (Sandbox Code Playgroud)
现在我想使用Manipulate,并做同样的事情.我可以像上面这样做第一个例子:
Manipulate[
Sin[b],
Control[{{b, 0, "b="}, -2 Pi, 2 Pi, ControlType -> Slider}]
]
Run Code Online (Sandbox Code Playgroud)
在上面,Manipulate负责处理'动态'的东西,并在'b'改变时更新Sin [b].
现在,我想看看我是否可以使用Manipulate进行第二种情况,所以我可以写:
Manipulate[
a,
Control[{{b, 0, "b="}, -2 Pi, 2 Pi, ControlType -> Slider}] (*where to insert Sin[b]?*)
]
Run Code Online (Sandbox Code Playgroud)
('a'必须初始化为初始显示的某个值).
但我无法弄清楚如何在上面使用'b'的第二个参数.无法弄清楚语法,现在确定是否可能?
当然,不能只写
Manipulate[
a,
{Slider[Dynamic[b, (b = #; a = Sin[b]; #) &], {-2 Pi, 2 Pi}]}
] …
Run Code Online (Sandbox Code Playgroud) 关于在Mathematica中创建记录的问题已在少数几个地方讨论过,例如Mathematica中的Struct数据类型?.
所有这些方法的问题在于,人们似乎失去了对每个参数进行特定额外检查的能力,就像人们做的那样x_?NumericQ
.
我的问题是:在Mathematica中有没有办法制作记录或结构,但是能够在各个元素上使用上述检查?
我试图找到一种方法来使用,因为我厌倦了在它们上面调用10个参数的函数(有时候一个人无法避免这种情况),即使我试图使每个函数都非常具体,最小化数量参数,一些功能只需要很多参数来完成特定的工作.
首先,我展示了我所知道的三种方法.
foo[p_]:=Module[{},
Plot[Sin[x],{x,from/.p,to/.p}]
]
p={from->-Pi,to->Pi};
foo[p]
Run Code Online (Sandbox Code Playgroud)
优点:安全,好像我将符号'从'更改为其他东西,它仍然有效.如下例所示.
foo[p_]:=Module[{},
Plot[Sin[x],{x,from/.p,to/.p}]
]
p={from->-Pi,to->Pi};
from=-1; (* By accident the symbol from was set somewhere. It will work*)
foo[p]
Run Code Online (Sandbox Code Playgroud)
Clear[p,foo];
foo[p_]:=Module[{},
Print[p];
Plot[Sin[x],{x,p["from"],p["to"]}]
]
p["from"] = -Pi;
p["to"] = Pi;
foo[p]
Run Code Online (Sandbox Code Playgroud)
优点:也是安全的,字符串是不可变的.不必担心"从"值的变化.但到处都有字符串不太可读?
Clear[p,to,from];
foo[p_]:=Module[{},
Plot[Sin[x],{x,p[from],p[to]}]
]
p[from] = -Pi;
p[to] = Pi;
foo[p]
Run Code Online (Sandbox Code Playgroud)
缺点:如果任何符号'从'或'到'某处被覆盖,将导致问题,如
from=-4; (*accidentally the symbol from is assigned a value*)
foo[p]
Run Code Online (Sandbox Code Playgroud)
所以.我认为方法(1)是最安全的.但现在我失去了这样做的能力:
foo[from_?NumericQ, to_?NumericQ] := Module[{},
Plot[Sin[x], {x, from, to}] …
Run Code Online (Sandbox Code Playgroud) 我觉得我做了些傻事.
我将我的单元格样式更改为"代码"并开始更改缩进并按照我喜欢的方式移动代码,(因为在"代码"单元格样式中更容易实现,因为笔记本界面不会妨碍).但经过一段时间的尝试后,我发现了这种风格的其他问题.
现在我将样式改回'输入'.但是现在所有的代码都包含了所有这些额外的空格,并且代码看起来不再像原来的"输入"样式那样好看.
我对代码进行了太多编辑和手动格式化.
有没有办法告诉Mathematica将代码"自动格式化"回默认输入样式?即删除所需的所有额外空间,按照它们的方式重新排列等等......
如果我必须亲手做到这一点,我将永远带我.我找不到这样的选项.我在菜单上尝试了很多选项,没有任何帮助.
PS.在Matlab中,这是微不足道的,只需选择所有代码,然后从菜单中选择"smart-ident",它就会这样做.
PS.我尝试过emacs Mathematica模式,他们也没有prety-print.
编辑
我试过这些:选择单元格,然后选择单元格 - >转换为,然后选择'输入窗体'并选择'输入窗体显示'.
这似乎已经删除了所有额外的空白区域.这很好.现在我只需要在所有正确的位置点击返回以将其恢复为原始形式.
至少这比手动删除空格要好得多.所以,灾难现在似乎已被遏制.
编辑
将"代码"样式转换回"标准格式"后的屏幕截图.很难读.
谢谢,
编辑
为了确定问题是什么,给出了一些Mathematica代码,这些代码被"修复",并手动格式化,手动空间插入和手动插入返回,现在如果我只是将它放在具有默认样式的笔记本中,我希望它能够智能缩进到默认设置,并拥有所有换行等等......好像它最初是以默认样式编写的.即如果使用"输入"代码样式编写它将会是什么样的.
这是一个小函数,作为我手工格式化的一个例子.当我将它粘贴在这里时,它看起来格式不会更好.如果您将此代码复制到您的笔记本,默认样式,然后如何自动将其格式化回默认设置而不用手工完成?
If[Abs@omega <= $MachineEpsilon,
(
data = {{0, 0}};
p = ListPlot[data, Sequence@plotOptions]
),
(
driverPeriod = 2. Pi/Abs@omega;
valuesOfDriverAmplitude =
Range[aStart, aStart + aLen, aLen/aIntervals];
timeValues =
Range[initialDriverPeriod*driverPeriod,
finalDriverPeriod*driverPeriod, driverPeriod ];
data =
Table[0, {Length[valuesOfDriverAmplitude]}, {Length[timeValues ]}];
total = Length[timeValues]*Length[valuesOfDriverAmplitude];
bifurcationProgress = 0.;
count = 0.;
Do[
(
{x1, x2, x3} =
solve[q, valuesOfDriverAmplitude [[i]], omega, phase,
initialDriverPeriod*driverPeriod,
(finalDriverPeriod)*driverPeriod, …
Run Code Online (Sandbox Code Playgroud) RowSpacings允许更改网格中的行间距.
帮助说:
RowSpacings->{Subscript[s, 12],Subscript[s, 23],...} can be used to specify
different spacings between different rows. If there are more rows than
entries in this list, then the last element of the list is used repeatedly
for the remaining rows
Run Code Online (Sandbox Code Playgroud)
注意,它表示上面的剩余行.
我想要的是让所有起始行使用一些间距,但最后一行使用不同的间距.
此示例执行记录的方式(其余行)
n = 5;
data = Table[Random[], {n}, {n}];
Grid[data, Frame -> All, RowSpacings -> {6, 1}, Alignment -> Center]
Run Code Online (Sandbox Code Playgroud)
但我想反过来,即将最后一行设置为某个东西,将所有行设置为另一行.只有这样我才能做到这一点很长,即通过写下所有行的所有间距直到最后一行:
n = 5;
data = Table[Random[], {n}, {n}];
Grid[data, Frame -> All,
RowSpacings -> {Sequence @@ …
Run Code Online (Sandbox Code Playgroud) 有没有办法MatrixForm
在线上水平显示行向量而不是像列向量那样垂直显示?因为这有时让我困惑.你认为在矩阵形式周围编写包装来调整这种行为会很困难吗?
例如,这是一个2乘2的矩阵.行显示与列相同.两者都显示为垂直.
问题:是否可以将MatrixForm
显示行向量水平放置而不是垂直放置?
对不起,如果之前有人询问,快速搜索没有显示任何内容.
谢谢
更新(1)
fyi,这是在Matlab中,它自动水平和垂直打印行,我希望有这样的东西.但是我现在将使用Heike的建议,因为它解决了这个问题,只需要额外打字.
更新(2)
使用Hilderic解决方案也很好,我总是很难以我能读取的方式打印3D矩阵.现在它正在使用这个{}
技巧