src/Util.jl

changeset 7
900a7e18ca01
parent 4
59fd17a3cea0
child 8
44ac3683263c
equal deleted inserted replaced
6:a5c1eb932d19 7:900a7e18ca01
134 return sum(v)/prod(size(v)) 134 return sum(v)/prod(size(v))
135 end 135 end
136 136
137 @inline function proj_norm₂₁ball!(y, α) 137 @inline function proj_norm₂₁ball!(y, α)
138 α²=α*α 138 α²=α*α
139 y′=reshape(y, (size(y, 1), prod(size(y)[2:end])))
140 139
141 @inbounds @simd for i=1:size(y′, 2)# in CartesianIndices(size(y)[2:end]) 140 if ndims(y)==3 && size(y, 1)==2
142 n² = norm₂²(@view(y′[:, i])) 141 @inbounds for i=1:size(y, 2)
143 if n²>α² 142 @simd for j=1:size(y, 3)
144 y′[:, i] .*= (α/√n²) 143 n² = y[1,i,j]*y[1,i,j]+y[2,i,j]*y[2,i,j]
144 if n²>α²
145 v = α/√n²
146 y[1, i, j] *= v
147 y[2, i, j] *= v
148 end
149 end
150 end
151 else
152 y′=reshape(y, (size(y, 1), prod(size(y)[2:end])))
153
154 @inbounds @simd for i=1:size(y′, 2)# in CartesianIndices(size(y)[2:end])
155 n² = norm₂²(@view(y′[:, i]))
156 if n²>α²
157 y′[:, i] .*= (α/√n²)
158 end
145 end 159 end
146 end 160 end
147 end 161 end
148 162
149 end # Module 163 end # Module

mercurial