Skip to content

Commit 61692a7

Browse files
committed
vec_uninit
1 parent c2095c9 commit 61692a7

File tree

2 files changed

+18
-6
lines changed

2 files changed

+18
-6
lines changed

lax/src/eigh.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,10 @@ macro_rules! impl_eigh {
4242
assert_eq!(layout.len(), layout.lda());
4343
let n = layout.len();
4444
let jobz = if calc_v { b'V' } else { b'N' };
45-
let mut eigs = vec![Self::Real::zero(); n as usize];
45+
let mut eigs = unsafe { vec_uninit(n as usize) };
4646

4747
$(
48-
let mut $rwork_ident = vec![Self::Real::zero(); 3 * n as usize - 2];
48+
let mut $rwork_ident = unsafe { vec_uninit(3 * n as usize - 2 as usize) };
4949
)*
5050

5151
// calc work size
@@ -69,7 +69,7 @@ macro_rules! impl_eigh {
6969

7070
// actual ev
7171
let lwork = work_size[0].to_usize().unwrap();
72-
let mut work = vec![Self::zero(); lwork];
72+
let mut work = unsafe { vec_uninit(lwork) };
7373
unsafe {
7474
$ev(
7575
jobz,
@@ -98,10 +98,10 @@ macro_rules! impl_eigh {
9898
assert_eq!(layout.len(), layout.lda());
9999
let n = layout.len();
100100
let jobz = if calc_v { b'V' } else { b'N' };
101-
let mut eigs = vec![Self::Real::zero(); n as usize];
101+
let mut eigs = unsafe { vec_uninit(n as usize) };
102102

103103
$(
104-
let mut $rwork_ident = vec![Self::Real::zero(); 3 * n as usize - 2];
104+
let mut $rwork_ident = unsafe { vec_uninit(3 * n as usize - 2) };
105105
)*
106106

107107
// calc work size
@@ -128,7 +128,7 @@ macro_rules! impl_eigh {
128128

129129
// actual evg
130130
let lwork = work_size[0].to_usize().unwrap();
131-
let mut work = vec![Self::zero(); lwork];
131+
let mut work = unsafe { vec_uninit(lwork) };
132132
unsafe {
133133
$evg(
134134
&[1],

lax/src/lib.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,3 +168,15 @@ impl NormType {
168168
}
169169
}
170170
}
171+
172+
/// Create a vector without initialization
173+
///
174+
/// Safety
175+
/// ------
176+
/// - Memory is not initialized. Do not read the memory before write.
177+
///
178+
unsafe fn vec_uninit<T: Sized>(n: usize) -> Vec<T> {
179+
let mut v = Vec::with_capacity(n);
180+
v.set_len(n);
181+
v
182+
}

0 commit comments

Comments
 (0)