Direct access to Shape
Nobody has claimed this yet.
Assessment
- Difficulty
- 5/5
- Estimated time
- Over a week
- Newbie friendliness
- 35/100
Research direction
Start by reading ArrayBase::dim, raw_dim, as_slice, and as_slice_memory_order, then trace the Shape and ShapeBuilder APIs referenced in the issue. Done means callers can directly obtain an array's Shape and determine row-major, column-major, or non-contiguous layout without relying on the workaround shown.
Written by the indexing model from the issue text.
Description
I have this code, which takes a matrix and tries to create a matrix with similar specifications, i.e. a matrix with the same Shape. Unfortunately, this turns out to be more complicated then I hoped, because I don't have an easy way to check the memory layout of my matrix.
The reasons are:
- I don't have direct access to
Shape, but only toDim::Pattern(viaArrayBase::dim) orDim(viaArrayBase::raw_dim). If I could get theShapefrom an array, I could pass it to the various methods that accept aT: ShapeBuilder. - There is no way to check if a matrix is in column major or row major form. Similarly, there is no way to check if a
Shapeis for column or row major form.
The only workaround that I see and am using, is to call as_slice and as_slice_memory_order on my array. If the first call returns an Option, I know I am in row major form. If it returns None but as_slice_memory_order returns an Option, I know I am in column major form. Both of these methods of course depend on the current specific implementation in ndarray.
It would be nice to have a more direct check for the memory layout. This is important when writing methods that call blas or lapack functions.
See the code below for reference.
fn from_matrix<S>(a: &ArrayBase<S, Ix2>) -> Result<Self>
where S: Data<Elem = f64>
{
use cblas::Layout::*;
let dim = a.dim();
let shape = match utils::get_layout(a) {
Some(ColumnMajor) => dim.f(),
Some(RowMajor) => dim.into_shape(),
None => Err(Error::NonContiguous)?,
};
Self::from_shape(shape)
}
fn from_shape<T>(shape: T) -> Result<Self>
where T: ShapeBuilder<Dim = Ix2>,
{
// Unfortunately we cannot check the shape itself to see if it's
// in ColumnMajor or RowMajor layout. So we need to first construct
// an array and then check that.
let shape = shape.into_shape();
let q = Array2::zeros(shape);
let memory_layout = match get_layout(&q) {
Some(layout) => layout,
None => Err(Error::NonContiguous)?,
};
let r = q.clone();
Ok(ClassicalGramSchmidt {
q,
r,
memory_layout,
})
}
fn get_layout<S, T, D>(a: &ArrayBase<S, D>) -> Option<cblas::Layout>
where S: Data<Elem=T>,
D: Dimension
{
if let Some(_) = a.as_slice() {
Some(cblas::Layout::RowMajor)
} else if let Some(_) = a.as_slice_memory_order() {
Some(cblas::Layout::ColumnMajor)
} else {
None
}
}
- Dominant language
- Rust
- Stars
- 4.3k
- Forks
- 391
- PR merge metrics
- No merged PRs in 30d
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from rust-ndarray/ndarray
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
rust-ndarray/ndarray#1612 · 1 comment ·
-
Difficulty 4/5 3-5 days Newbie friendliness 48/100
rust-ndarray/ndarray#1617 · 1 comment ·
-
bug good first issue
Difficulty 3/5 1-2 days Newbie friendliness 68/100
rust-ndarray/ndarray#1615 · 1 comment ·
-
Difficulty 4/5 3-5 days Newbie friendliness 48/100
rust-ndarray/ndarray#1610 ·
-
Difficulty 3/5 1-2 days Newbie friendliness 72/100
rust-ndarray/ndarray#1609 ·
All issues in rust-ndarray/ndarray
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 86/100
kwakseongjae/auto-hwp#319 ·
-
area:cli bug filter-quality good first issue priority:medium
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
-
Difficulty 1/5 Under an hour Newbie friendliness 72/100
bevyengine/bevy#25861 ·
-
comp-datalake
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
ClickHouse/ClickHouse#121222 ·
-
enhancement remote
Difficulty 2/5 1-3 hours Newbie friendliness 68/100