Hi there,
I am trying to apply a bivariate function f across an arbitrary dimensional array A and a vector B. I want to apply this function across the dimension of A that matches length with B. For example if A is 3-dimensional and the matching dimension is the second one, then I want to be able to do
C = copy(A)
for i in eachindex(B)
@. C[:, i, :] = f(view(A, :, i, :), B[i])
end
For testing purposes, f can be *.
I have the following code:
function dimwise(f, A::AbstractArray, B::AbstractVector)
m = findfirst(isequal(length(B)), size(A))
isnothing(m) && error("A and B have no matching dimensions.")
return dimwise(f, A, B, m)
end
dimwise(f, A::AbstractArray, B::AbstractVector, m::Int) =
dimwise!(copy(A), f, A, B, m)
function dimwise!(C, f, A::AbstractArray, B::AbstractVector, m::Int)
for i in eachindex(B)
@. C[...] = f(view(A, [...]), B[i])
end
return C
end
This finds the number of the matching dimension, m. What I need to be able to do is apply the line @. C[...] = f(view(A, [...]), B[i]) by adding the correct sequence of colons : and index i within the brackets [...].
Anyone know of a simple, yet performant way to do this?
EDIT: importantly, I need to ensure that C has identical structure with A as far as size is concerned.