-
Notifications
You must be signed in to change notification settings - Fork 318
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
Impl a lifetime-relaxed broadcast for ArrayView #1219
base: master
Are you sure you want to change the base?
Conversation
The |
c7cdf52
to
70fbc80
Compare
Thanks for this PR! I agree that this method would be useful. This is related to issue #1208, which discussed slicing. However, broadcasting is different, because we can't have a broadcasting equivalent of I don't like the name
|
This will allow upcast to be reused in other functions, such as the upcoming ArrayView::broadcast_ref.
ArrayView::broadcast has a lifetime that depends on &self instead of its internal buffer. This prevents writing some types of functions in an allocation-free way. For instance, take the numpy `meshgrid` function: It could be implemented like so: ```rust fn meshgrid_2d<'a, 'b>(coords_x: ArrayView1<'a, X>, coords_y: ArrayView1<'b, X>) -> (ArrayView2<'a, X>, ArrayView2<'b, X>) { let x_len = coords_x.shape()[0]; let y_len = coords_y.shape()[0]; let coords_x_s = coords_x.into_shape((1, y_len)).unwrap(); let coords_x_b = coords_x_s.broadcast((x_len, y_len)).unwrap(); let coords_y_s = coords_y.into_shape((x_len, 1)).unwrap(); let coords_y_b = coords_y_s.broadcast((x_len, y_len)).unwrap(); (coords_x_b, coords_y_b) } ``` Unfortunately, this doesn't work, because `coords_x_b` is bound to the lifetime of `coord_x_s`, instead of being bound to 'a. This commit introduces a new function, broadcast_ref, that does just that.
70fbc80
to
28e887e
Compare
Hello! |
@jreniel Please open an issue if you want to discuss an implementation of |
ArrayView::broadcast has a lifetime that depends on &self instead of its internal buffer. This prevents writing some types of functions in an allocation-free way. For instance, take the numpy
meshgrid
function: It could be implemented like so:Unfortunately, this doesn't work, because
coords_x_b
is bound to the lifetime ofcoord_x_s
, instead of being bound to 'a.This PR introduces a new function, broadcast_ref, that behaves exactly like broadcast, but the returned arrayview is bound to the lifetime of the internal storage instead.