我正在进行一项项目,我正在进行大量基于索引的计算.我有几行像:
let mut current_x: usize = (start.x as isize + i as isize * delta_x) as usize;
Run Code Online (Sandbox Code Playgroud)
start.x并且i是usizes和delta_x类型isize.我的大多数数据都是无符号的,因此将其签名存储没有多大意义.另一方面,当我操作一个数组时,我正在访问很多,我必须将所有内容转换回来,usize如上所示.
整数之间的铸造是否昂贵?它对运行时性能有影响吗?
还有其他方法可以更轻松/更有效地处理索引算术吗?
我想在 TensorFlow 中做类似这段 Numpy 代码的事情:
a = np.zeros([5, 2])
idx = np.random.randint(0, 2, (5,))
row_idx = np.arange(5)
a[row_idx, idx] = row_idx
Run Code Online (Sandbox Code Playgroud)
意思是用另一个张量索引一个 2D 张量的所有行,然后为其分配一个张量。我对如何实现这一目标完全一无所知。
到目前为止,我在 Tensorflow 中可以做的如下
a = tf.Variable(tf.zeros((5, 2)))
idx = tf.constant([0, 1, 1, 0, 1])
row_idx = tf.range(5)
indices = tf.transpose([row_idx, idx])
r = tf.gather_nd(a, indices)
tf.assign(r, row_idx) # This line does not work
Run Code Online (Sandbox Code Playgroud)
当我尝试执行此操作时,在最后一行中出现以下错误:
AttributeError: 'Tensor' object has no attribute 'assign'
Run Code Online (Sandbox Code Playgroud)
有没有解决的办法?必须有一些很好的方法来做到这一点,我不想用 for 循环遍历数据并在每个元素的基础上手动分配它。我知道现在数组索引不像 Numpy 的功能那么先进,但这应该仍然是可能的。
我想对特定的数组元素执行简单的递增操作:
最小的不工作示例:
array[1..2] of var 0..1: a = [0, 0];
constraint forall (i in 1..2) (
a[i] = a[i] + 1
);
output ["\(a)"];
solve satisfy;
Run Code Online (Sandbox Code Playgroud)
这会产生minizinc输出
WARNING: model inconsistency detected
stack.mzn:3:
in call 'forall'
in array comprehension expression
with i = 1
stack.mzn:4:
in binary '=' operator expression
=====UNSATISFIABLE=====
% stack.fzn:1: warning: model inconsistency detected before search.
Run Code Online (Sandbox Code Playgroud)
为什么这是模型中的不一致 - 为什么我不能引用当前数组元素的旧值?还有其他方法可以将当前数组元素增加1吗?
我是限制性解决的新手,所以我希望这不是一个非常愚蠢的问题.