标签: commutativity

可交换的oprator重载+ 2个不同的对象

我有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)

或者是否有编译器自己决定的一般形式?

谢谢

c++ operator-overloading operator-keyword commutativity

6
推荐指数
1
解决办法
3329
查看次数

真正无序的可折叠包

我想要一个袋子容器,它隐藏了客户的"真实"订单.

它也必须是完全多态的,不应该对其元素类型有任何约束.

我发现了至少三种袋子的实现:Bag来自ghc包装,Data.Bag来自bagMath.Combinatorics.Multiset来自的模块multiset-comb.

然而,它们都具有暴露元件内部顺序的操作toListfold*操作,这可能取决于实现细节或袋构造的顺序.

toList是不可能的,至少是类型Bag a -> [a].但是,折叠并不总是暴露订单.

例如,fold (+) 0不公开.

问题是,我应该如何设计折叠界面?是否有必要和充分的a -> a -> a折叠功能安全条件?由于fmap没有暴露订单,折叠时a -> b -> b是否会失去通用性?

我正在考虑可交换的幺半群 - 它们似乎已经足够了,但我不确定是否有必要使用关联性和身份元素.

haskell types bag commutativity

6
推荐指数
1
解决办法
284
查看次数

非交换的 symify(或简化)

我希望能够简化 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

有没有办法简化上面的字符串以保留xy的非交换性?

我发现有人已经在这里问过这个问题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

5
推荐指数
1
解决办法
3702
查看次数

来自熊猫的 groupby 是可交换的吗?

我想知道是否通过以下方式选择了行:

groupby(['a', 'b']) 
Run Code Online (Sandbox Code Playgroud)

与通过以下方式选择的行相同:

groupby(['b', 'a'])
Run Code Online (Sandbox Code Playgroud)

在这种情况下,行的顺序无关紧要。

groupby没有不满足交换性的情况?

python commutativity pandas

5
推荐指数
2
解决办法
118
查看次数

isabelle证明了交换性

我试图证明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)

logic proof commutativity isabelle

4
推荐指数
1
解决办法
760
查看次数

类似Powershell的算子不是可交换的

考虑以下:

$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.谢谢.

powershell commutativity

3
推荐指数
1
解决办法
489
查看次数

boost 提供 make_zip_range 吗?

这个关于 SO 的答案中,有一条评论暗示了一个有用的 C++ 构造,类似于make_zip_iterator, 但对于范围:它需要一个范围元组并产生一个新范围 - 其begin()end()迭代器是适当的 zip 迭代器。

现在,这应该不太难实现,但我想知道 - Boost 不是已经以某种方式提供了吗?

c++ boost iterator tuples commutativity

3
推荐指数
1
解决办法
1950
查看次数

在 Rust 特征绑定中需要交换操作

假设我有一组相关的非标量结构,在它们上定义了一个可交换的算术运算。例如,

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)

traits rust commutativity

3
推荐指数
1
解决办法
77
查看次数

在表达式中使所有符号可交换

假设你在一个表情符号中有许多非交换符号,比如说

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)

这个答案中,声明在没有替换符号的情况下,没有办法在创建之后改变符号的交换性,但也许有一种简单的方法可以在块中更改像这样的表达式的所有符号?

python sympy commutativity

2
推荐指数
1
解决办法
195
查看次数

Haskell:使用翻转会导致错误:'.&gt;' 的方程具有不同数量的参数

我正在努力理解这里发生了什么。我想实现一个数据类型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 …

haskell commutativity

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