Add unsafe methods to initialize a DVec or DMat without initialization.
This commit is contained in:
parent
05470bba90
commit
3b814b462f
23
src/dmat.rs
23
src/dmat.rs
|
@ -17,6 +17,21 @@ pub struct DMat<N> {
|
||||||
priv mij: ~[N]
|
priv mij: ~[N]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<N> DMat<N> {
|
||||||
|
/// Creates an uninitialized matrix.
|
||||||
|
#[inline]
|
||||||
|
pub unsafe fn new_uninitialized(nrows: uint, ncols: uint) -> DMat<N> {
|
||||||
|
let mut vec = vec::with_capacity(nrows * ncols);
|
||||||
|
vec::raw::set_len(&mut vec, nrows * ncols);
|
||||||
|
|
||||||
|
DMat {
|
||||||
|
nrows: nrows,
|
||||||
|
ncols: ncols,
|
||||||
|
mij: vec
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<N: Zero + Clone> DMat<N> {
|
impl<N: Zero + Clone> DMat<N> {
|
||||||
/// Builds a matrix filled with zeros.
|
/// Builds a matrix filled with zeros.
|
||||||
///
|
///
|
||||||
|
@ -95,7 +110,7 @@ impl<N: One + Zero + Clone> DMat<N> {
|
||||||
/// components.
|
/// components.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn new_identity(dim: uint) -> DMat<N> {
|
pub fn new_identity(dim: uint) -> DMat<N> {
|
||||||
let mut res = DMat::new_zeros(dim, dim);
|
let mut res = DMat::new_zeros(dim, dim);
|
||||||
|
|
||||||
for i in range(0u, dim) {
|
for i in range(0u, dim) {
|
||||||
let _1: N = One::one();
|
let _1: N = One::one();
|
||||||
|
@ -142,7 +157,7 @@ impl<N: Clone + Mul<N, N> + Add<N, N> + Zero> Mul<DMat<N>, DMat<N>> for DMat<N>
|
||||||
fn mul(&self, other: &DMat<N>) -> DMat<N> {
|
fn mul(&self, other: &DMat<N>) -> DMat<N> {
|
||||||
assert!(self.ncols == other.nrows);
|
assert!(self.ncols == other.nrows);
|
||||||
|
|
||||||
let mut res = DMat::new_zeros(self.nrows, other.ncols);
|
let mut res = unsafe { DMat::new_uninitialized(self.nrows, other.ncols) };
|
||||||
|
|
||||||
for i in range(0u, self.nrows) {
|
for i in range(0u, self.nrows) {
|
||||||
for j in range(0u, other.ncols) {
|
for j in range(0u, other.ncols) {
|
||||||
|
@ -165,7 +180,7 @@ RMul<DVec<N>> for DMat<N> {
|
||||||
fn rmul(&self, other: &DVec<N>) -> DVec<N> {
|
fn rmul(&self, other: &DVec<N>) -> DVec<N> {
|
||||||
assert!(self.ncols == other.at.len());
|
assert!(self.ncols == other.at.len());
|
||||||
|
|
||||||
let mut res : DVec<N> = DVec::new_zeros(self.nrows);
|
let mut res : DVec<N> = unsafe { DVec::new_uninitialized(self.nrows) };
|
||||||
|
|
||||||
for i in range(0u, self.nrows) {
|
for i in range(0u, self.nrows) {
|
||||||
let mut acc: N = Zero::zero();
|
let mut acc: N = Zero::zero();
|
||||||
|
@ -186,7 +201,7 @@ LMul<DVec<N>> for DMat<N> {
|
||||||
fn lmul(&self, other: &DVec<N>) -> DVec<N> {
|
fn lmul(&self, other: &DVec<N>) -> DVec<N> {
|
||||||
assert!(self.nrows == other.at.len());
|
assert!(self.nrows == other.at.len());
|
||||||
|
|
||||||
let mut res : DVec<N> = DVec::new_zeros(self.ncols);
|
let mut res : DVec<N> = unsafe { DVec::new_uninitialized(self.ncols) };
|
||||||
|
|
||||||
for i in range(0u, self.ncols) {
|
for i in range(0u, self.ncols) {
|
||||||
let mut acc: N = Zero::zero();
|
let mut acc: N = Zero::zero();
|
||||||
|
|
13
src/dvec.rs
13
src/dvec.rs
|
@ -54,6 +54,19 @@ impl<N: Rand> DVec<N> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<N> DVec<N> {
|
||||||
|
/// Creates an uninitialized vec.
|
||||||
|
#[inline]
|
||||||
|
pub unsafe fn new_uninitialized(dim: uint) -> DVec<N> {
|
||||||
|
let mut vec = vec::with_capacity(dim);
|
||||||
|
vec::raw::set_len(&mut vec, dim);
|
||||||
|
|
||||||
|
DVec {
|
||||||
|
at: vec
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<N: Clone> DVec<N> {
|
impl<N: Clone> DVec<N> {
|
||||||
/// Builds a vector filled with a constant.
|
/// Builds a vector filled with a constant.
|
||||||
#[inline]
|
#[inline]
|
||||||
|
|
Loading…
Reference in New Issue