我正在定义一个符号函数
Items.CalcItems(new Item1(), 30);
Items.CalcItems(new Item2(), 12);
当我尝试syms x(n);
x(n) = (n==0);
n=-1:1;
时
我得到了
x(n)+x(n-1)
我想强制使用符号函数替换值,以便我得到以下结果。
[ -1 == 0, 0 == 0, 1 == 0]
+[ -2 == 0, -1 == 0, 0 == 0]
=[ -3 == 0, -1 == 0, 1 == 0]
我尝试了类似 [ 0, 1, 0]
+[ 0, 0, 1]
=[ 0, 1, 1]
和x(n) = logical(n==0);
的内容,但我得到的结果相同。
我知道x(n) = double(n==0);
有效,但我想直接使用double(x(n))+double(x(n-1))
并在符号函数的定义中进行替换。
可以这样做吗?
答案 0 :(得分:2)
我认为piecewise
是在Mupad中将布尔值转换为整数的唯一方法。不幸的是,它仅在Mupad本身可用,因此您必须使用evalin
来获取它:
syms asinteger(fun) x(n)
asinteger(fun) = evalin(symengine,'piecewise([fun,1],[Otherwise,0])');
x(n) = asinteger(n==0);
n=-1:1;
>> x(n)+x(n-1)
ans =
[ 0, 1, 1]
将asinteger
函数视为double
或int64
的符号版本。
答案 1 :(得分:0)
我认为最简单的方法是使用isAlways
来评估表达式(相等或不等式)是否为真:
syms x(n);
x(n) = (n==0);
m = -1:1; % Use a different variable to not overwrite symbolic n
isAlways(x(m))+isAlways(x(m-1))
或者您可以使用匿名函数来避免多次调用isAlways
:
m = -1:1;
x = @(n)isAlways(sym(n)==0);
x(m)+x(m-1)
这两个都返回一个双精度数组([0 1 1]
)。您可以使用logical
将其转换为逻辑数组。您可能还会发现sym/isequaln
在某些情况下很有用。