我决定在Rust中做2D矢量叉积。在JavaScript中,这很容易做到:
float CrossProduct( const Vec2& a, const Vec2& b ) {
return a.x * b.y - a.y * b.x;
}
我试图将其转换为Rust系统:
// Just created two separate variables for the two different vectors
let vec1 = vec![1.15, 7.0];
let vec2 = vec![7.0, 2.0];
let cross_product(&vec1, &vec2) = vec1[0] * vec2[1] - vec1[1] * vec2[0];
println!("{}", cross_product);
// I also tried return.
let vec1 = vec![1.15, 7.0];
let vec2 = vec![7.0, 2.0];
let cross_product(&vec1, &vec2) {
return (vec1[0] * vec2[1] - vec1[1] * vec2[0]);
}
println!("{}", cross_product);
我以为其中的一种会起作用,但是对我而言,这更像是一个现实检查,Rust与以前使用的任何语言有何不同。
我发现解决此问题的方法效率很低,但是我宁愿学习正确地做到这一点。我是Rust的新手,所以请尝试一下盐。
答案 0 :(得分:1)
您似乎主要在Rust语法方面遇到问题。您可以创建叉积函数或内联叉积。
sum
如果需要功能,可以连续使用。
df$value <- df$value + sapply(l[match(df$id, names(l))], sum)
df
# id value
#1 a 6
#2 b 7
第二种解决方案可能会产生误导,因为即使传递不同大小的向量,它也总是会产生2x2向量的叉积。
答案 1 :(得分:1)
有两种可能的方法。
您可以声明一个函数并将其传递给println!()
,这与许多编程语言(例如Java,C#
等)相似。
//Declare the function
fn cross_product(slice1: &[i32], slice2: &[i32]) -> i32 {
slice1[0] * slice2[1] - slice1[1] * slice2[2]
}
//Use it Like following
fn main() {
let vec1 = vec![1, 2, 3];
let vec2 = vec![4, 5, 6];
println!("{}", cross_product(&vec1[..], &vec2[..]));
}
您可以声明闭包并将其传递给函数编程中的一种常见方法println!()
:
// You can declare a closure and use it as function in the same code block
fn main() {
let vec1 = vec![1, 2, 3];
let vec2 = vec![4, 5, 6];
let cross_product = |slice1: &[i32], slice2: &[i32]| -> i32 {
let result = slice1[0] * slice2[1] - slice1[1] * slice2[2];
result
};
println!("{}", cross_product(&vec1[..], &vec2[..]));
}
请注意,我已经使用i32
数据类型创建了向量和闭包,该数据类型对应于一个整数。您可以使用f32
更改类型,也可以使用更大的浮动范围f64
。