- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在准备回答 Count how many different values a list takes in Mathematica 时我在 DeleteDuplicates
中都遇到了不稳定(因为没有更好的术语)和 Tally
我不明白。
首先考虑:
a = {2.2000000000000005, 2.2, 2.1999999999999999};
a // InputForm
DeleteDuplicates@a // InputForm
Union@a // InputForm
Tally@a // InputForm
{2.2000000000000006`, 2.2, 2.1999999999999997`}
{2.2000000000000006`, 2.2, 2.1999999999999997`}
{2.1999999999999997`, 2.2, 2.2000000000000006`}
{{2.2000000000000006`, 3}}
This behavior is as I expected in each case. Tally
compensates for the slight numerical differences and sees each element as being equivalent. Union
and DeleteDuplicates
see all elements as unique. (This behavior of Tally
is not documented to my knowledge, but I have made use of it before.)
Now, consider this complication:
a = {11/5, 2.2000000000000005, 2.2, 2.1999999999999997};
a // InputForm
DeleteDuplicates@a // InputForm
Union@a // InputForm
Tally@a // InputForm
{11/5, 2.2000000000000006, 2.2, 2.1999999999999997}
{11/5, 2.2000000000000006, 2.2}
{2.1999999999999997, 2.2, 11/5, 2.2000000000000006}
{{11/5, 1}, {2.2000000000000006, 1}, {2.2, 2}}
The output of Union
is as anticipated, but the results from both DeleteDuplicates
and Tally
are surprising.
Why does DeleteDuplicates
suddenly see 2.1999999999999997
as a duplicate to be eliminated?
Why does Tally
suddenly see 2.2000000000000006
and 2.2
as distinct, when it did not before?
As a related point, it can be seen that packed arrays affect Tally
:
a = {2.2000000000000005, 2.2, 2.1999999999999999};
a // InputForm
Tally@a // InputForm
{2.2000000000000006, 2.2, 2.1999999999999997}
{{2.2000000000000006`, 3}}
a = Developer`ToPackedArray@a;
a // InputForm
Tally@a // InputForm
最佳答案
所表现出的行为似乎是与浮点运算相关的常见问题以及所讨论的某些函数中的一些可疑行为的结果。
SameQ 不是等价关系
首先在石板上:考虑 SameQ
不是等价关系,因为它不是传递的:
In[1]:= $a = {11/5, 2.2000000000000005, 2.2, 2.1999999999999997};
In[2]:= SameQ[$a[[2]], $a[[3]]]
Out[2]= True
In[3]:= SameQ[$a[[3]], $a[[4]]]
Out[3]= True
In[4]:= SameQ[$a[[2]], $a[[4]]]
Out[4]= False (* !!! *)
SameQ
的记录规则所致。也就是说,如果两个实数“最后一个二进制数字不同”,则它们被视为“相等”:
In[5]:= {# // InputForm, Short@RealDigits[#, 2][[1, -10;;]]} & /@ $a[[2;;4]] // TableForm
(* showing only the last ten binary digits for each *)
Out[5]//TableForm= 2.2000000000000006 {0,1,1,0,0,1,1,0,1,1}
2.2 {0,1,1,0,0,1,1,0,1,0}
2.1999999999999997 {0,1,1,0,0,1,1,0,0,1}
$a[[3]]
和
$a[[4]]
最后两个二进制数字不同,但差异的大小是最低位的一位。
DeleteDuplicates[...]
相当于
DeleteDuplicates[..., SameQ]
.嗯,这是完全正确的——但可能不是你所期望的:
In[6]:= DeleteDuplicates[$a] // InputForm
Out[6]//InputForm= {11/5, 2.2000000000000006, 2.2}
In[7]:= DeleteDuplicates[$a, SameQ] // InputForm
Out[7]//InputForm= {11/5, 2.2000000000000006, 2.2}
In[8]:= DeleteDuplicates[$a, SameQ[#1, #2]&] // InputForm
Out[8]//InputForm= {11/5, 2.2000000000000006, 2.1999999999999997}
DeleteDuplicates
当比较函数明显为
SameQ
时,会经历不同的逻辑分支与行为与
SameQ
相同的函数相反.
Tally
表现出类似但不完全相同的不稳定行为:
In[9]:= Tally[$a] // InputForm
Out[9]//InputForm= {{11/5, 1}, {2.2000000000000006, 1}, {2.2, 2}}
In[10]:= Tally[$a, SameQ] // InputForm
Out[10]//InputForm= {{11/5, 1}, {2.2000000000000006, 1}, {2.2, 2}}
In[11]:= Tally[$a, SameQ[#1, #2]&] // InputForm
Out[11]//InputForm= {{11/5, 1}, {2.2000000000000006, 1}, {2.2000000000000006, 2}}
Equal
票价比
SameQ
好一点——但强调“小”。
Equal
查看最后七位二进制数字而不是最后一位。但是,这并不能解决问题……总能找到麻烦的情况:
In[12]:= $x1 = 0.19999999999999823;
$x2 = 0.2;
$x3 = 0.2000000000000018;
In[15]:= Equal[$x1, $x2]
Out[15]= True
In[16]:= Equal[$x2, $x3]
Out[16]= True
In[17]:= Equal[$x1, $x3]
Out[17]= False (* Oops *)
SameQ
,
Equal
,
DeleteDuplicates
,
Tally
他们所有的 friend 都没有机会。
关于wolfram-mathematica - DeleteDuplicates 和 Tally 中的不稳定性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6166895/
我刚刚创建了一个非常大的神经网络,尽管是在非常强大的硬件上,想象一下我的震惊和失望,当我意识到 NeuralNetworks 包中的 NeuralFit[] 似乎只使用一个核心,甚至没有发挥到最大能力
我想知道是否有办法在 Mathematica 中处理大文件? 目前我有一个大约 500Mb 的文件,其中包含表数据。 Import["data.txt","Table"]; 什么是替代方式? 最佳答案
Mathematica 是否支持为数学符号安装非 Wolfram 字体? 其他数学符号字体的例子包括最近发布的 STIX 字体、微软的 Cambria 字体、Latex 下使用的 Math Tim
这是一个简单的 WolframCloud computation : 当 0 Infinity]会显示正确答案,即Boole[0Infinity] 输出应该是Boole[0 Infinity] 顺便说
在 MATHEMATICA 中是否有一种快速简便的方法来截断十进制数,比如超过 4 位? 对于 N[1/6, 4],它四舍五入为 =1.6667。 我要你切到 1.6666。 谢谢! 最佳答案 f[x
我有一个等式(因为是 VBA 代码所以使用了括号) Y=(P/(12E((bt^3)/12))*A 我知道每个变量,但不知道“b”。有什么方法可以让 Wolfram Alpha“重新定义”(而不是求解
我找到了 Wolfram Workbench Mathematica 开发的良好环境。 然而,当我在 Mathematica 中编程时,我需要经常浏览帮助系统。 Workbench 提供了一个工具提示
问题 我正在查看 Wolfram's Mathematica 生成随机数的方法,发现它使用 Cellular Automata Rule 30 .其基本解释如下: 一个基本元胞自动机的演化可以完全用一
我需要对可变数量的集合的笛卡尔积求和。假设 f[...] 是一个多元函数,定义 p[A__set] := Module[{Alist, args, iterators,it}, Alist =
当鼠标光标在 Wolfram|Alpha 中的 2D 绘图上时,会出现一对灰线,帮助您读取 x 和 y 轴的坐标 . For example ,我将鼠标悬停在以下 Airy 函数图中的转折点之一上。
我正在 Mathematica 中生成一个双面板图形。底部面板在 y 轴上具有负值,这会导致该轴上的标签(使用 FrameLabel 生成)比顶部面板上的标签向左对齐,后者具有正值。我无法将面板连接到
我有几个在 Mathematica 中生成的表达式,我想将它们导出到外部 C 程序的源代码中。 “CForm”几乎可以满足我的要求,只是求幂表示为对 Power() 的调用。 .我的表达式只涉及小幂,
Wolfram 系统建模器有一个名为 "equation browser" 的函数, youtube 视频 here (at 20:58) 介绍了“方程浏览器”,我想知道Dymola是否有相同的功能,
我有适用于 Mac 的 Mathematica 8.0 和 Wolfram Workbench 2.0。我想使用 MUnit 对我正在创建的包进行单元测试,但我发现缺少有关 MUnit 的文档令人沮丧
我希望能够通过具有大量内存的计算机的命令行来处理 Wolfram 语言。这似乎很容易通过 GCP 实现。我会创建一个大实例,根据需要使用它,然后删除该实例。我很好奇,我将如何在 GCP 上安装和设置
给定字符串中符号的名称,如何多次为其赋值?例如,假设我想定义一个名称为 varname 的值的符号,并且我想为它分配一个值: varname = "foo" Symbol[varname]=5 这是行
我的笔记本中有类似以下内容。 test1[g_] := (g == 5); test2[g_] := (g == 6); tests={"test1", "test2"} ToExpression[#
我正在尝试学习一些 Julia,在阅读了几个小时的手册后,我编写了以下代码: ie = 200; ez = zeros(ie + 1); hy = zeros(ie); fdtd1d (steps)=
不确定我正在尝试做的事情是否有意义。我正在用mathematica 对一些代码进行原型(prototype)设计,有一天我希望用C++ 编写。我只能以 double 计算的环境(因为我使用的是 MS
我经常希望看到不在 FullForm 中的 Mathematica 图形对象的内部表示。但更具可读性 InputForm能够通过双击选择部分代码,并轻松将此代码复制到新输入 Cell .但默认Inpu
我是一名优秀的程序员,十分优秀!