小编Sza*_*lcs的帖子

粘贴Mathematica代码,以便将其分解为单独的输入单元格

我经常将Mathematica代码从网站(例如SO)复制到笔记本中.代码通常被粘贴为单个输入单元格.我正在寻找一种简单的方法将其粘贴为几个输入单元格,以便于逐步评估.

例如,

a = 2;
f[x_] := x^a

Plot[f[x], {x,0,2}]
Run Code Online (Sandbox Code Playgroud)

理想情况下会粘贴为两个输入单元格.最好还应保留手动格式化(即原始换行符)(默认粘贴不是这种情况).

通常,如果选择所有输入单元格(ALT-单击),将它们复制到文本编辑器中,然后将生成的文本复制回笔记本,应该与复制的原始单元格相当.

wolfram-mathematica cells mathematica-frontend

8
推荐指数
1
解决办法
1276
查看次数

Orthogonalize []仅在应用两次时按预期工作

申请Orthogonalize[]一次:

v1 = PolyhedronData["Dodecahedron", "VertexCoordinates"][[1]]; 
Graphics3D[Line[{{0, 0, 0}, #}] & /@
  Orthogonalize[{a, b, c} /.
    FindInstance[{a, b, c}.v1 == 0 && (Chop@a != 0.||Chop@b != 0.||Chop@c != 0.),
     {a, b, c}, Reals, 4]], Boxed -> False]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

现在两次:

Graphics3D[Line[{{0, 0, 0}, #}] & /@
  Orthogonalize@Orthogonalize[{a, b, c} /.
    FindInstance[{a, b, c}.v1 == 0 && (Chop@a != 0.||Chop@b != 0.||Chop@c != 0.),
     {a, b, c}, Reals, 4]], Boxed -> False]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

呃...为什么?

wolfram-mathematica

8
推荐指数
2
解决办法
343
查看次数

在编译中,Do/Return的行为有所不同 - 为什么?

我想知道这是一个错误还是记录在案的行为?

f1 = Function[v, 
  Do[If[v[[i]] < 0, Return[v[[i]]]], {i, 1, Length[v]}]]

c1 = Compile[{{v, _Integer, 1}}, 
  Do[If[v[[i]] < 0, Return[v[[i]]]], {i, 1, Length[v]}]]
Run Code Online (Sandbox Code Playgroud)

将它们应用于不包含负数的列表时,我们会得到不同的结果:

In[66]:= Through[{f1, c1}[{1, 2, 3}]]

Out[66]= {Null, 3}
Run Code Online (Sandbox Code Playgroud)

当我尝试编译一个简短的函数(实际上是它的修改版本)时,这会导致错误.

Do 单独没有显示问题:

c2 = Compile[{}, Do[i, {i, 5}]]

c2[] (* returns nothing, as expected *)
Run Code Online (Sandbox Code Playgroud)

wolfram-mathematica

8
推荐指数
2
解决办法
382
查看次数

如何设计这个程序,并考虑到简单的修改?

这个问题是关于如何设计程序,以便进行某些修改.

我有一个类,它包含一些(非平凡的)数据,并有几个成员函数来更改这些数据.

有时我需要计算这些数据的一些属性.但是,每次改变都要从头开始重新计算它.相反,计算这些属性的小更新要快得多.

我有几个这样的属性,我需要能够轻松地添加到我的班级或从我的班级删除(或打开/关闭)进行一些数值实验.该类仅由我自己修改并用于数值模拟(科学代码).

具体例子

假设我有一个包含数字的类x.但我也需要2^x("属性" x).基本课程是:

class C {
    double x;

public:
    C() : x(0.0) 
    { }

    void inc() { x += 1; } 
    void dec() { x -= 1; } 
    void set(double x_) { x = x_; } 
};
Run Code Online (Sandbox Code Playgroud)

但现在我需要跟踪2^x并在每次x更改时不断更新此值.所以我最终得到了

class expC {
    double expx;

public:        
    expC(const double &x) {
        recompute(x);
    }

    void inc() { expx *= 2; } // fast incremental change
    void dec() { expx /= 2; …
Run Code Online (Sandbox Code Playgroud)

c++

8
推荐指数
1
解决办法
146
查看次数

Doxygen:防止由于前向声明和模板导致的重复

Doxygen通常很好地处理前向声明.例如,

/** \file */

class A;

class B {
    // uses A
};

class A {
    // uses B
};
Run Code Online (Sandbox Code Playgroud)

结果是

在此输入图像描述

没有重复A.

但是,如果我制作AB类模板,则A提取两次:

/** \file */

template<typename T> class A;

template<typename T>
class B {
    // uses A<T>
};

template<typename T>
class A {
    // uses B<T>
};
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我怎么能阻止这个?

c++ doxygen

8
推荐指数
1
解决办法
269
查看次数

Mathematica中哪些对象是原子的?

我正在寻找Mathematica中的原子对象的完整列表(其AtomQ产量True).

我知道

Symbol
String
Integer
Real
Rational
Complex

SparseArray
BooleanFunction
Graph
Run Code Online (Sandbox Code Playgroud)

还有其他人吗?

参考:http://reference.wolfram.com/mathematica/tutorial/BasicObjects.html

编辑: 从上面列表的答案中不断添加新符号.

wolfram-mathematica

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

在Mathematica和MIDI踏板事件中叠加音乐曲目

以下所有内容均指音乐/ MIDI(SoundNote对象),而非采样声音.

不幸的是,Mathematica似乎无法导入MIDI.我正在尝试为单个乐器文件(专注于钢琴)制作一个基于MIDI < - > CSV的简单MIDI导入器.

Sound在Mathematica中叠加两个对象的最简单方法是什么?

Show 连接它们,它不会叠加.

一个不太简单的方法是拆卸SoundSoundNoteS,每次转换SoundNote的时间规范成{Tstart, Tend}格式,并组装这些到一个新的声音.有一个简单的方法吗?

第二个问题:

有没有一种简单的方法来处理Mathematica中的踏板事件,同时仍然使用内部声音表示和MIDI播放器,而不是通过其他方式播放MIDI?

midi wolfram-mathematica

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

如何使外部Mathematica功能可以中断?

我之前有一个关于将Mathematica与用C++编写的函数集成的问题.

这是一个后续问题:

如果计算时间过长,我希望能够使用评估>中止评估中止它.答案中建议的哪些技术可以实现可中断的基于C的扩展功能?如何在C端实施"可中断性"?

我需要以一种既不会破坏它,也不会损坏Mathematica内核的方式使我的函数可中断(即应该可以在Mathematica被中断后再次调用该函数)

c interop wolfram-mathematica mathlink

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

是否可以从命令行调用Mathematica的diff功能?

TortoiseSVN(以及其他Tortoise客户端)包括一个用于在Mathematica中区分笔记本文件的脚本.Mathematica的Diff功能在AuthorTools包中实现(也许有更好的东西?)

该脚本目前的工作原理是在临时目录中创建一个小型笔记本文件,并在前端打开它.笔记本有一个大按钮,可以做差异,并有文件名进行硬编码.

缺点是具有diff代码的笔记本将保留在临时目录中,并且不会被清除.每次我们做差异时,似乎没有必要打开辅助笔记本.

是否可以从命令行启动diff功能以避免通过临时笔记本?或者有没有其他强大的方法来改善这个过程并避免使用辅助笔记本乱丢临时文件夹?

欢迎任何改善差异化体验的建议!

请注意,由于TortoiseSVN是一个Windows程序,我主要对基于Windows的解决方案感兴趣.


这是脚本生成的示例笔记本.我意识到它需要清理,但是上次我检查它在版本5中工作了(!),所以我不想不必要地触摸它(没有明显改进的东西).

Notebook[{ 
  Cell[BoxData[ButtonBox["\<\"Compare Notebooks\"\>", 
       ButtonFrame->"DialogBox", Active->True, ButtonEvaluator->Automatic,
       ButtonFunction:>(Needs["AuthorTools`"]; NotebookPut[Symbol["NotebookDiff"]["one.nb", "two.nb"]])
  ]], NotebookDefault] },
  Saveable->False, Editable->False, Selectable->False, WindowToolbars->{}, 
  WindowFrame->ModelessDialog, WindowElements->{}, 
  WindowFrameElements->CloseBox, WindowTitle->"Diff", 
  ShowCellBracket->False, WindowSize->{Fit,Fit}
]
Run Code Online (Sandbox Code Playgroud)

tortoisesvn wolfram-mathematica wsh mathematica-frontend

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

为变量创建强大的实时监控器

我们可以为这样的变量创建一个实时监视器:

CreatePalette@Panel@Row[{"x = ", Dynamic[x]}]
Run Code Online (Sandbox Code Playgroud)

(如果x恰好是类似的话,这会更有趣和有用$Assumptions.设置一个值然后忘记它就很容易了.)

不幸的是,如果重新启动内核(Quit[]然后评估一些内容),这将停止工作.调色板不会再显示值的变化x.

有没有办法做到这一点,所以它在内核会话中保持工作?我发现自己经常重启内核.(如果生成的调色板导致内核在完成后自动启动Quit.)


更新: 如评论中所述,事实证明,只有在我们通过评估退出时,调色板才会停止工作Quit[].使用时Evaluation -> Quit Kernel -> Local,它会继续工作.


wolfram-mathematica dynamic mathematica-frontend

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