我在mathematica中主要是一个Table函数用户.但是我注意到在几个使用Array而不是Table来表示相同结果的例子中,它运行速度明显更快,尤其是随着表的维度变大.
所以我的问题是:当执行速度是主要问题时,何时最适合使用表?
是什么解释了这种差异
我的猜测是因为Arrays假设列表中的项目之间存在功能关系,它会更有效地存储它们,因此使用更少的内存,从而便于存储和后续处理?
它是怎么回事?
我试图删除mathematica中的矩阵.这样做的一种不优雅的方式就像我在下面所做的那样,即在新的矩阵中指定它
S = Table[
Ss[[If[i < t, i, i + 1]]][[If[j < t, j, j + 1]]], {i, q}, {j, q}];
Run Code Online (Sandbox Code Playgroud)
目标是消除行和列t.
确实删除一行很容易删除[Ss,t].对于列列,我想我可以做
Transpose[Delete[Transpose[Ss,t]]]
Run Code Online (Sandbox Code Playgroud)
我主要关心的是以尽可能快的方式执行它.
更一般地说,是否有一个Mathematica运算符,它可以像对行进行切片和切块一样容易,而无需使用转置?
我正在定义一个函数,它将一个函数作为输入,我想在输入类型中指定它,即Operat [_?FunctionQ]:= ...但是在mathematica中还没有函数Q. 除了没有指定任何类型之外,我该如何解决这个问题.
有任何想法吗?
哦! 这:测试表达式是否为函数? 可能是我正在寻找的答案.我正在进一步阅读
提出的解决方案是否健壮?,即:
FunctionQ[_Function | _InterpolatingFunction | _CompiledFunction] = True;
FunctionQ[f_Symbol] := Or[
DownValues[f] =!= {},
MemberQ[ Attributes[f], NumericFunction ]]
FunctionQ[_] = False;
Run Code Online (Sandbox Code Playgroud) types functional-programming wolfram-mathematica function operators
我有时候一直面临这个问题,部分由于Microsoft Office自动保存您正在使用的文件和自动恢复这一事实造成的懒惰.
很多时候,当我在mathematica中开始使用新笔记本进行某些测试时,我经常忘记保存我正在做的事情.
时不时地,根据我使用的计算机,计算机崩溃,我正在做的所有美好的工作永远丢失......
有没有办法绕过这个另外每隔五分钟手动保存我的文件?文件版本怎么样?
顺便说一句:使用MMA V8
我试图定义一个接收矩阵的函数,当它的尺寸没有作为输入提供时,在可选参数中计算这些尺寸 d
这不起作用,但给你的想法(选项参数需要是常量):
Options[DimM] = {d -> Dimensions[A]};
DimM[A_?MatrixQ, OptionsPattern[]] := OptionValue@d;
Run Code Online (Sandbox Code Playgroud)
实际上,简单的方法是输入一个不可能的值,并在函数def中输入if条件
Options[DimM] = {d -> 0};
DimM[A_?MatrixQ, OptionsPattern[]] :=If[OptionValue@d==0,Dimensions[A],OptionValue@d]
Run Code Online (Sandbox Code Playgroud)
我怎样才能最有效地完成这项工作?
这个问题在某种程度上延续了我在这里提出的问题:在Mathematica中删除矩阵列的简单方法是 @belisarius和@Daniel提供了非常有用的答案.
我通常要做的是从矩阵中提取特定的行和列,或者在删除指定的内容后剩下的内容.所以这可以正式写成,找到TakeOperator和Drop运算符,这样:
TakeOperator [A,{i1,..,ip},{j1,...,jq}] =(A [[ik]] [[jl]])(1 <= k <= p,1 <= 1 <= q)=Table[A[[ik]][[jl]],{k,p},{l,q}]
我们注意到Ic = {i'1,...,i'p'} = Complement[{1,...,Length[A]},{i1,...,ip}]; Jc = {j'1,... ,j'q'} = Complement[{1,...,Length[A]},{j1,...,jq}];
DropOperator [A,{i1,..,ip},{j1,...,jq}] =(A [[ik]] [[jl]])(1 <= k'<= p',1 < = l'<= q')=Table[A[[ik']][[jl']],{k',p'},{l','q}]
虽然Table如上所述,但以这种方式使用Table是非常低效的.
为了给出一个想法,我拿了@ belisarius的例子:
In: First@Timing[a = RandomInteger[1000, {5000, 5000}];]
Out:0.218
In:Clear[b,c]
In:First@Timing[
b = Table[
If[i < 100, If[j < 100, a[[i]][[j]], a[[i]][[j + 1]]],
If[j < 100, a[[i + …Run Code Online (Sandbox Code Playgroud) 如何在Mathematica中定义一个特殊的运算符,例如一种特殊类型的加法或乘法运算符?我过去做过,但我不记得我把代码放在哪里了.我尝试在两个矩阵上定义这个填充的小圆运算符:
A_\[FilledSmallCircle] B_ :=
Which[(MatrixQ[A] || VectorQ[A]) && (MatrixQ[B] || VectorQ[B]),
A.B, ! (MatrixQ[A] || VectorQ[A]) && (MatrixQ[B] || VectorQ[B]),
A@B, (MatrixQ[A] || VectorQ[A]) && ! (MatrixQ[B] || VectorQ[B]),
Transpose[B@Transpose[A]]];
Run Code Online (Sandbox Code Playgroud)
但它不起作用.我究竟做错了什么?
我已经多次针对mathematica理解函数的输入数据声明类型遇到了这个问题.
似乎Mathematica理解以下类型声明:_Integer,_List,_?MatrixQ,_?VectorQ
但是:_Real,_Complex声明例如导致函数有时不计算.知道为什么吗?
这里的一般规则是什么?
我试图MemberQ穿过一个列表,即:
我有
a={{1, 9}, {2, 5}, {3, 1}, {4, 3}};
b= {1, 5, 2, 6};
Run Code Online (Sandbox Code Playgroud)
理想情况下,我希望有一个线程和可列表MemberQ函数TLMemberQ来执行以下操作:
TLMember[a,b]返回{True,True,False,False}.我怎样才能以最快的速度执行此操作.注意:既不起作用Thread@MemberQ也MemberQ@Thread不起作用.MemberQ属性是Protected
function ×2
matrix ×2
operators ×2
types ×2
arrays ×1
autosave ×1
definition ×1
operations ×1
versioning ×1