Add an unsafe `at_fast` method for unchecked read access to DVec and DMat.

This commit is contained in:
Sébastien Crozet 2013-09-13 11:32:30 +02:00
parent 3b814b462f
commit 72395f3546
2 changed files with 24 additions and 4 deletions

View File

@ -149,7 +149,14 @@ impl<N: Clone> DMat<N> {
pub fn at(&self, row: uint, col: uint) -> N {
assert!(row < self.nrows);
assert!(col < self.ncols);
self.mij[self.offset(row, col)].clone()
unsafe { vec::raw::get(self.mij, self.offset(row, col)) }
}
// FIXME: put that on a `raw` module.
/// Just like `at` without bounds checking.
#[inline]
pub unsafe fn at_fast(&self, row: uint, col: uint) -> N {
vec::raw::get(self.mij, self.offset(row, col))
}
}
@ -164,7 +171,9 @@ impl<N: Clone + Mul<N, N> + Add<N, N> + Zero> Mul<DMat<N>, DMat<N>> for DMat<N>
let mut acc: N = Zero::zero();
for k in range(0u, self.ncols) {
acc = acc + self.at(i, k) * other.at(k, j);
unsafe {
acc = acc + self.at_fast(i, k) * other.at_fast(k, j);
}
}
res.set(i, j, acc);
@ -186,7 +195,9 @@ RMul<DVec<N>> for DMat<N> {
let mut acc: N = Zero::zero();
for j in range(0u, self.ncols) {
acc = acc + other.at[j] * self.at(i, j);
unsafe {
acc = acc + other.at_fast(j) * self.at_fast(i, j);
}
}
res.at[i] = acc;
@ -207,7 +218,9 @@ LMul<DVec<N>> for DMat<N> {
let mut acc: N = Zero::zero();
for j in range(0u, self.nrows) {
acc = acc + other.at[j] * self.at(j, i);
unsafe {
acc = acc + other.at_fast(j) * self.at_fast(j, i);
}
}
res.at[i] = acc;

View File

@ -35,6 +35,13 @@ impl<N: Zero + Clone> DVec<N> {
}
}
impl<N: Clone> DVec<N> {
/// Indexing without bounds checking.
pub unsafe fn at_fast(&self, i: uint) -> N {
vec::raw::get(self.at, i)
}
}
impl<N: One + Clone> DVec<N> {
/// Builds a vector filled with ones.
///