我有一个结构良好的树,代表一个数学表达式.例如,给定字符串:"1+2-3*4/5",这将被解析为:
subtract(add(1,2),divide(multiply(3,4),5))
Run Code Online (Sandbox Code Playgroud)
这表示为这棵树:

我希望能够做的就是把这棵树尽可能地减少它.在上面的例子中,这很简单,因为所有的数字都是常量.然而,一旦我允许未知数(用a $后面跟一个标识符表示),事情开始变得棘手:
"3*$a/$a" 变 divide(multiply(3,$a), $a)
这应该简化为3,因为这些$a术语应该相互抵消.问题是,"我如何以通用的方式认识到这一点?" 我如何认识到这min(3, sin($x))将永远存在sin($x)?我怎么认出那sqrt(pow($a, 2))是abs($a)?我怎么认识到nthroot(pow(42, $a), $a)(第 42 个权力的根源)是42?
我意识到这个问题相当广泛,但是我一直在打击这个问题一段时间并没有得到足够令人满意的东西.
while (temp->left->oper == '+' ||
temp->left->oper == '-' ||
temp->left->oper == '*' ||
temp->left->oper == '/' ||
temp->right->oper == '+' ||
temp->right->oper == '-' ||
temp->right->oper == '*' ||
temp->right->oper == '/')
{
// do something
}
Run Code Online (Sandbox Code Playgroud)
为了清楚起见:temp是一个指向以下node结构的指针:
struct node
{
int num;
char oper;
node* left;
node* right;
};
Run Code Online (Sandbox Code Playgroud) 我有一个曲线列表,我想减少点数,但仍然保持曲线的整体形状.
基本上,我想从这个:

对此:

因此,该算法将删除多余的点,但保留那些真正定义形状的点(如曲线底部的点).有没有已知的算法可以做到这一点?我希望有,但我不确定在Google上搜索什么.任何帮助,将不胜感激.
我有一个非常复杂的mathematica表达式,我想通过使用一个新的,可能无量纲的参数来简化.
我的表达的一个例子是:
K=a*b*t/((t+f)c*d);
Run Code Online (Sandbox Code Playgroud)
(实际表达式是巨大的,数千个字符).我想用p替换所有出现的表达式t /(t + f)
p=t/(t+f);
Run Code Online (Sandbox Code Playgroud)
这里的目标是找到一个替代品,以便所有的t和f都被p代替.在这种情况下,替换p是一个无量纲化的参数,因此它似乎是一个很好的候选替代品.
我无法弄清楚如何在mathematica中做到这一点(或者如果可能的话).我试过了:
eq1= K==a*b*t/((t+f)c*d);
eq2= p==t/(t+f);
Solve[{eq1,eq2},K]
Run Code Online (Sandbox Code Playgroud)
毫不奇怪,这不起作用.如果有一种方法可以强制它用p,a,b,c,d来解决K ,这可能会起作用,但我也无法弄清楚如何做到这一点.思考?
编辑#1(11/10/11 - 1:30)[删除以简化]
好的,新机智.我采用了p = ton /(ton + toff)并将p乘以几个表达式.我知道p可以完全消除.新表达式(以p表示)是
testEQ = A B p + A^2 B p^2 + (A+B)p^3;
Run Code Online (Sandbox Code Playgroud)
然后我替换p,并调用(正常)FullSimplify,给我这个表达式.
testEQ2= (ton (B ton^2 + A^2 B ton (toff + ton) +
A (ton^2 + B (toff + ton)^2)))/(toff + ton)^3;
Run Code Online (Sandbox Code Playgroud)
最后,我尝试了下面的所有建议,除了最后一个(不知道它是如何工作的!)
只有消除选项有效.所以我想我会从现在开始尝试这种方法.谢谢.
EQ1 = a1 == (ton (B ton^2 + A^2 B ton (toff + ton) +
A (ton^2 …Run Code Online (Sandbox Code Playgroud) 我有以下方法,我想更短或更快,如果没有别的.欢迎所有评论:
Bellow方法接受一个日期对象,形成它("EEE hh:mma MMM d,yyyy"),然后确定日期是今天还是昨天,如果是,则返回"(昨天|今天)hh:mma "格式化的字符串.
public static String formatToYesterdayOrToday(String date) {
SimpleDateFormat sdf = new SimpleDateFormat("EEE hh:mma MMM d, yyyy");
Date in = null;
try {
in = sdf.parse(date);
} catch (ParseException e) {
log.debug("Date parsing error:", e);
}
Calendar x = Calendar.getInstance();
x.setTime(in);
String hour = Integer.toString(x.get(Calendar.HOUR));
String minute = Integer.toString(x.get(Calendar.MINUTE));
String pm_am = x.get(Calendar.AM_PM) == Calendar.AM ? "AM" : "PM";
x.set(Calendar.HOUR, 0);
x.set(Calendar.HOUR_OF_DAY, 0);
x.set(Calendar.MINUTE, 0);
x.set(Calendar.SECOND, 0);
x.set(Calendar.MILLISECOND, 0);
Calendar today = Calendar.getInstance();
today.set(Calendar.HOUR, 0);
today.set(Calendar.HOUR_OF_DAY, …Run Code Online (Sandbox Code Playgroud) 你知道一种更简单的方法来获得与此相同的结果吗?我有这个代码:
color1 = input("Color 1: ")
color2 = input("Color 2: ")
if ((color1=="blue" and color2=="yellow") or (color1=="yellow" and color2=="blue")):
print("{0} + {1} = Green".format(color1, color2))
Run Code Online (Sandbox Code Playgroud)
我也试过这个:
if (color1 + color2 =="blueyellow" or color1 + color2 =="yellowblue")
Run Code Online (Sandbox Code Playgroud) python if-statement simplify conditional-statements python-3.x
关于F#中元素组合的最优雅和简单实现的另一个问题.
它应该返回输入元素的所有组合(列表或序列).第一个参数是组合中的元素数量.
例如:
comb 2 [1;2;2;3];;
[[1;2]; [1;2]; [1;3]; [2;2]; [2;3]; [2;3]]
Run Code Online (Sandbox Code Playgroud) 我需要自动简化一些符号表达式,但simplifymatlab 的功能无法完成我需要的一切.
例:
simplify(expand((ax + bx)^2 + (ay + by)^2))
Run Code Online (Sandbox Code Playgroud)
这导致输出
ax^2 + 2*ax*bx + ay^2 + 2*ay*by + bx^2 + by^2
Run Code Online (Sandbox Code Playgroud)
所以我试图创建自己的规则,使输出更漂亮
function [ result ] = simplify_pretty( term )
read(symengine, 'simplify_pretty_rules.mu');
result = feval(symengine, 'Simplify', term, 'SelectRules = simplify_pretty_rules')
end
Run Code Online (Sandbox Code Playgroud)
与"simplify_pretty_rules.mu"
simplify_pretty_rules := proc()
begin
[
Rule(#X^2 - 2 * #X * #Y + #Y^2, (#X - #Y)^2),
Rule(#X^2 + 2 * #X * #Y + #Y^2, (#X + #Y)^2)
]
end_proc:
Run Code Online (Sandbox Code Playgroud)
这适用于像...这样的输入
simplify_pretty(expand((ax + bx)^2 …Run Code Online (Sandbox Code Playgroud) 我需要f(x)=exp(A*x)反复计算一个微小的,可变的列向量x和一个巨大的,恒定的矩阵A(许多行,几列).换句话说,x很少,但A*x很多.我的问题维度是这样的,它A*x占用了与exp()部分一样多的运行时间.
除了泰勒展开,并预先计算值的范围exp(y)(假设已知的范围内y的值A*x),这是我没有设法大大加快(同时保持精度)就什么MATLAB是对自己做的,我考虑分析性地重述问题,以便能够预先计算某些值.
例如,我发现了 exp(A*x)_i = exp(\sum_j A_ij x_j) = \prod_j exp(A_ij x_j) = \prod_j exp(A_ij)^x_j
这将允许我预先计算exp(A)一次,但是循环中所需的取幂与原始exp()函数调用一样昂贵,并且必须另外执行乘法(\ prod).
我还有其他想法可以遵循,或者我可能错过了MATLAB中的解决方案吗?
编辑:更多细节
A尺寸为81的是26873856(是的,那是巨大的),所以x是81乘1.
nnz(A) / numel(A)是0.0012,nnz(A*x) / numel(A*x)是0.0075.我已经使用稀疏矩阵来表示A,但稀疏矩阵的exp()不再稀疏.所以事实上,我存储x非稀疏和我计算的exp(full(A*x))结果是快/慢full(exp(A*x))(我认为无论A*x是非稀疏的,因为x是非稀疏的.)exp(full(A*sparse(x)))是一种稀疏的方法A*x,但速度较慢.甚至更慢的变体exp(A*sparse(x))(对于稀疏类型的非稀疏矩阵具有双倍的内存影响)和full(exp(A*sparse(x))(其再次产生非稀疏结果).
sx = sparse(x);
tic, …Run Code Online (Sandbox Code Playgroud) 根据LeafLet文档,PolyLine有一个"smoothFactor"参数:http://leafletjs.com/reference.html#polyline ,它允许折线简化以提高性能.有谁知道范围是什么(例如最小值和最大值)以及您是否注意到使用它的性能改进?我尝试了不同的值,如0.1,1,5,10,100,并没有注意到缩放/平移性能的变化.
simplify ×10
algorithm ×3
if-statement ×2
matlab ×2
c++ ×1
combinations ×1
curve ×1
date ×1
exp ×1
f# ×1
graphics ×1
java ×1
javascript ×1
leaflet ×1
list ×1
math ×1
mupad ×1
performance ×1
points ×1
python ×1
python-3.x ×1
replace ×1
while-loop ×1