相关疑难解决方法(0)

如何在Rust中对矢量进行排序?

目前推荐的向量中的值排序方法是什么?

rust

62
推荐指数
2
解决办法
3万
查看次数

为什么IEEE 754保留了如此多的NaN值?

似乎IEEE 754标准将16,777,214个32位浮点值定义为NaN,或所有可能值的0.4%.

我想知道保留这么多有用值的理由是什么,而基本上只需要2个:一个用于信令,一个用于安静的NaN.

对不起,如果这个问题很简单,我在互联网上找不到任何解释.

floating-point nan ieee-754

40
推荐指数
2
解决办法
5835
查看次数

如何获取对 Vec 进行排序的索引?

我想获得在 Rust 中对 a 进行排序的索引Vec。实际上,我想argsort()从 numpy.

例如:

let v = vec![1, 7, 4, 2];
let i = argsort(&v);
assert_eq!(i, &[0, 3, 2, 1]);
Run Code Online (Sandbox Code Playgroud)

sorting rust

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

多个浮点数的最大锈蚀?

这是一个简单的问题,我正在编写一个返回多个浮点数最大值的函数,std::cmp::max给我:

the trait bound `{float}: std::cmp::Ord` is not satisfied
Run Code Online (Sandbox Code Playgroud)

我是否需要为每个项目都写这个:

macro_rules! max {
    ($x: expr) => ($x);
    ($x: expr, $($z: expr),+) => {{
        let y = max!($($z),*);
        if $x > y {
            $x
        } else {
            y
        }
    }}
}
Run Code Online (Sandbox Code Playgroud)

那么获得多个浮点数最大值的推荐方法是什么?

floating-point rust

11
推荐指数
0
解决办法
8901
查看次数

如何在Rust中使用带有f64的HashMap作为键?

我想使用a HashMap<f64, f64>,用于将已知x和y的点的距离保存到另一个点.f64因为价值在这里无关紧要,重点应放在关键上.

let mut map = HashMap<f64, f64>::new();
map.insert(0.4, f64::hypot(4.2, 50.0));
map.insert(1.8, f64::hypot(2.6, 50.0));
...
let a = map.get(&0.4).unwrap();
Run Code Online (Sandbox Code Playgroud)

由于f64既不是Eq也不是Hash,只是PartialEq,f64不足以作为重点.我需要先保存距离,但也要稍后通过y访问距离.y的类型需要是浮点精度,但如果不起作用f64,我将使用i64带有已知指数的.

我通过使用自己的方法尝试了一些hacks struct Dimension(f64),然后Hash通过将float转换为a String然后对其进行哈希来实现.

#[derive(PartialEq, Eq)]
struct DimensionKey(f64);

impl Hash for DimensionKey {
    fn hash<H: Hasher>(&self, state: &mut H) {
        format!("{}", self.0).hash(state);
    }
}
Run Code Online (Sandbox Code Playgroud)

这似乎非常糟糕,两个解决方案,我自己的struct或float作为带有base和exponent的整数似乎对于一个键来说非常复杂.

更新:我可以保证我的密钥永远不会是NaN,或者是无限的价值.此外,我不会计算我的密钥,只是迭代它们并使用它们.因此,已知错误应该没有错误0.1 + 0.2 ? 0.3. 如何在Vec of Floats上进行二进制搜索?并且这个问题的共同点是实现浮点数的总排序和相等,不同之处仅在于散列或迭代.

floating-point hashmap rust

8
推荐指数
4
解决办法
2902
查看次数

xy 未实现 Vec&lt;f64&gt; / 特征 `Ord` 的最小值/最大值

基于答案(导致std::cmp 函数),这里是工作游乐场

问题:
我尝试获取 Vec 的最小值/最大值。
由于 f64 有 NAN 和 Infinity,它不满足 Ord 并抱怨:

the trait `Ord` is not implemented for `f64`
Run Code Online (Sandbox Code Playgroud)

对于 NAN / Inf 从未包含在 Vec 中的情况,我怎样才能获得最小值/最大值?

rust

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

如何检查向量是否等于包含NaN和inf的另一个向量?

我师,在那里我有时需要检查我的结果要么是一个测试NaNinf,但它似乎是锈不考虑为NaN等于楠:

fn main() {
    let nan = "NaN".parse::<f64>().unwrap();
    println!("{:?}", nan);
    println!("{:?}", nan == nan);
} // NaN false
Run Code Online (Sandbox Code Playgroud)

如何比较含有NaN和无穷大的两个向量,看它们是否相等?

rust

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

获取片中最大或最小浮点值的索引或Rust中的Vec的惯用方法是什么?

假设 -该Vec<f32>不会具有任何NaN价值或表现出任何NaN行为.

采取以下样本集:

0.28  
0.3102
0.9856
0.3679
0.3697
0.46  
0.4311
0.9781
0.9891
0.5052
0.9173
0.932 
0.8365
0.5822
0.9981
0.9977
Run Code Online (Sandbox Code Playgroud)

获取上述列表中最高值索引的最新且最稳定的方法是什么(值可以是负数)?

我最初的尝试大致如下:

let _tmp = *nets.iter().max_by(|i, j| i.partial_cmp(j).unwrap()).unwrap();    
let _i = nets.iter().position(|&element| element == _tmp).unwrap();
Run Code Online (Sandbox Code Playgroud)

哪里nets&Vec<f32>.对我来说,这显然是不正确的.

相当于Python的Python(考虑到上面的假设):

_i = nets.index(max(nets))
Run Code Online (Sandbox Code Playgroud)

algorithm floating-point idiomatic rust

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

在浮点数向量上使用 max_by_key

我想使用基于某个键max_by_keyf64s的向量中获取最大值。这是一个简单的例子,用一个小向量abs作为关键:

let a: Vec<f64> = vec![-3.0, 0.2, 1.4];
*a.iter().max_by_key(|n| n.abs()).unwrap()
Run Code Online (Sandbox Code Playgroud)

但是,由于f64没有实现Ord,我得到

let a: Vec<f64> = vec![-3.0, 0.2, 1.4];
*a.iter().max_by_key(|n| n.abs()).unwrap()
Run Code Online (Sandbox Code Playgroud)

同样,sort_by_key失败并出现相同的错误:

a.sort_by_key(|n| n.abs())
Run Code Online (Sandbox Code Playgroud)

我知道我可以绕过偏序限制来对浮点数向量进行排序 sort_by

b.sort_by(|m, n| m.partial_cmp(n).unwrap_or(Less))
Run Code Online (Sandbox Code Playgroud)

但这必须在一个向量上调用b,我已经abs为 的每个元素计算了键(在这种情况下)a,然后我必须返回并找到 的相应元素a,这看起来既复杂又缓慢。随着列表中项目数量的增加,我想尽量减少通过数据的次数。

有什么解决方法吗?

iterator vector max rust

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

什么是最简单的链式比较方法,产生第一个不相等的方法?

对于具有可以比较的多个成员的结构或者sort_by回调,将数据与优先级进行比较是很常见的.

// Example of sorting a: Vec<[f64; 2]>, sort first by y, then x,
xy_coords.sort_by(
    |co_a, co_b| {
        let ord = co_a[1].cmp(&co_b[1]);
        if ord != std::cmp::Ordering::Equal {
            ord
        } else {
            co_a[0].cmp(&co_b[0])
        }
    }
);
Run Code Online (Sandbox Code Playgroud)

是否有更简单的方法来执行多个cmp函数,其中只返回第一个不相等的结果?

syntax comparison rust

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

如何在可能是整数或浮点数的泛型类型上调用`min`?

当我想在整数和浮点数上调用min时,我该怎么办?例如,考虑一下:

fn foo<T>(v1: T, v2: T)
    where ???
{
   ....
   let new_min = min(v1, v2);
   ....
}
Run Code Online (Sandbox Code Playgroud)

问题是min不起作用f32.花车还有一分钟.

我该如何解决这个问题?

rust

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