我有2个表示矩阵的类:
1.RegularMatrix - O(n ^ 2)表示
2. SparseMatrix - 表示为链表(没有零)的矩阵.
让我说我有:
RegularMatrix a;
SparseMatrix b;
Run Code Online (Sandbox Code Playgroud)
我希望能够做到:
a+b;
Run Code Online (Sandbox Code Playgroud)
并且:
b+a;
Run Code Online (Sandbox Code Playgroud)
所以我正在重载+运算符.我的问题是,因为我希望加法是可交换的(a + b = b + a),我是否需要实现2个过载,每种情况一个?
RegularMatrix operator+(const RegualarMatrix &, const SparseMatrix &);
RegularMatrix operator+(const SparseMatrix & ,const RegualarMatrix &);
Run Code Online (Sandbox Code Playgroud)
或者是否有编译器自己决定的一般形式?
谢谢
我想要一个袋子容器,它隐藏了客户的"真实"订单.
它也必须是完全多态的,不应该对其元素类型有任何约束.
我发现了至少三种袋子的实现:Bag来自ghc包装,Data.Bag来自bag和Math.Combinatorics.Multiset来自的模块multiset-comb.
然而,它们都具有暴露元件内部顺序的操作toList和fold*操作,这可能取决于实现细节或袋构造的顺序.
toList是不可能的,至少是类型Bag a -> [a].但是,折叠并不总是暴露订单.
例如,fold (+) 0不公开.
问题是,我应该如何设计折叠界面?是否有必要和充分的a -> a -> a折叠功能安全条件?由于fmap没有暴露订单,折叠时a -> b -> b是否会失去通用性?
我正在考虑可交换的幺半群 - 它们似乎已经足够了,但我不确定是否有必要使用关联性和身份元素.
我希望能够简化 Python 中字符串的数学表达式。有几种“可交换”的方法可以做到这一点。是否有一个不可交换的函数?
我知道sympy中的sympify可以做一些非交换工作,这里有一个例子:
from sympy import *
x=Symbol('x',commutative=False)
y=Symbol('y',commutative=False)
print sympify(3*x*y - y*x - 2*x*y)
Run Code Online (Sandbox Code Playgroud)
它将打印 x y -y x,但是如果我们将 sympify 应用于字符串,即
print sympify('3*x*y - y*x - 2*x*y')
Run Code Online (Sandbox Code Playgroud)
结果是0。
有没有办法简化上面的字符串以保留x和y的非交换性?
我发现有人已经在这里问过这个问题http://osdir.com/ml/python-sympy/2012-02/msg00250.html并且有人回答了http://osdir.com/ml/python-sympy/2012 -02/msg00255.html,但是该解决方案似乎一般不起作用。
我更愿意先问,如果没有立即解决方案,我想我必须自己编码。
python sympy mathematical-expressions python-2.7 commutativity
我想知道是否通过以下方式选择了行:
groupby(['a', 'b'])
Run Code Online (Sandbox Code Playgroud)
与通过以下方式选择的行相同:
groupby(['b', 'a'])
Run Code Online (Sandbox Code Playgroud)
在这种情况下,行的顺序无关紧要。
有groupby没有不满足交换性的情况?
我试图证明Isabelle/HOL的交换性是一种自定义的add功能.我设法证明了相关性,但我坚持这个.
定义add:
fun add :: "nat ? nat ? nat" where
"add 0 n = n" |
"add (Suc m) n = Suc(add m n)"
Run Code Online (Sandbox Code Playgroud)
相关性证明:
lemma add_Associative: "add(add k m) z = add k (add m z)"
apply(induction k)
apply(auto)
done
Run Code Online (Sandbox Code Playgroud)
交换的证明:
theorem add_commutativity: "add k m = add m k"
apply(induction k)
apply(induction m)
apply(auto)
Run Code Online (Sandbox Code Playgroud)
我有以下目标:
goal (3 subgoals):
1. add 0 0 = add 0 0
2. ?m. add 0 m = add …Run Code Online (Sandbox Code Playgroud) 考虑以下:
$var = 'Now is the time'
if ($var -like 'Now*') { 'true' } else { 'false' }
Run Code Online (Sandbox Code Playgroud)
输出:true
现在将两个操作数交换为-like运算符:
if ('Now*' -like $var) { 'true' } else { 'false' }
Run Code Online (Sandbox Code Playgroud)
输出:false
类似的运算符不是可交换的.这是预期的吗?
我在Win 7上,使用PS版本2.谢谢.
假设我有一组相关的非标量结构,在它们上定义了一个可交换的算术运算。例如,
struct Foo {
a: f64,
b: f64
}
impl Add<f64> for Foo {
type Output = Foo;
fn add(self, v: f64) -> Self::Output {
Foo {
a: self.a + v,
b: self.b + v
}
}
}
impl Add<Foo> for f64 {
type Output = Foo;
fn add(self, foo: Foo) -> Self::Output {
Foo {
a: foo.a + self,
b: foo.b + self
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想利用这个操作在这组结构上实现一个特征。也就是说,我想要如下内容:
trait Bar: Add<f64, Output = Self> + Sized {
fn right_add(self, f: …Run Code Online (Sandbox Code Playgroud) 假设你在一个表情符号中有许多非交换符号,比如说
a, c = sympy.symbols('a c', commutative=False)
b = sympy.Symbol('b')
expr = a * c + b * c
Run Code Online (Sandbox Code Playgroud)
使表达式中的所有符号都可交换的首选方法是什么,例如,sympy.simplify(allcommutative(expr)) = c * (a + b)?
在这个答案中,声明在没有替换符号的情况下,没有办法在创建之后改变符号的交换性,但也许有一种简单的方法可以在块中更改像这样的表达式的所有符号?
我正在努力理解这里发生了什么。我想实现一个数据类型Direction并.>为其定义一个可交换的运算符。到目前为止,我有这个:
data Direction = N | E | S | W | None
(.>) :: Direction -> Direction -> [Direction]
N .> S = [None]
W .> E = [None]
(.>) = flip (.>)
Run Code Online (Sandbox Code Playgroud)
我收到错误Equations for ‘.>’ have different numbers of arguments。这就是我不明白的,因为在 ghci 中检查时,等式的两边都有相同数量的参数:
?> :t (.>)
(.>) :: Direction -> Direction -> [Direction]
?> :t flip (.>)
flip (.>) :: Direction -> Direction -> [Direction]
Run Code Online (Sandbox Code Playgroud)
我可以通过写入d1 .> d2 = d2 .> d1 …