Skip to content

Commit eb0d23d

Browse files
committed
introduce applyColumns! for inplace replacement of calculations
1 parent 645d791 commit eb0d23d

3 files changed

Lines changed: 38 additions & 25 deletions

File tree

src/LinRegOutliers.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,17 @@ import .Basis:
2929
createRegressionSetting,
3030
@extractRegressionSetting,
3131
applyColumns,
32+
applyColumns!,
3233
find_minimum_nonzero,
3334
designMatrix,
3435
responseVector
36+
3537
export RegressionSetting
3638
export createRegressionSetting
3739
export designMatrix
3840
export responseVector
3941
export applyColumns
42+
export applyColumns!
4043
export find_minimum_nonzero
4144
export @extractRegressionSetting
4245

src/basis.jl

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ module Basis
33
export RegressionSetting
44
export createRegressionSetting
55
export @extractRegressionSetting
6-
export applyColumns
6+
export applyColumns, applyColumns!
77
export find_minimum_nonzero
88

99

@@ -297,6 +297,14 @@ function applyColumns(f::F, data::AbstractMatrix{Float64}) where {F <: Function}
297297
end
298298

299299

300+
function applyColumns!(target::Vector, f::F, data::AbstractMatrix) where {F <: Function}
301+
for i in 1:size(data, 2)
302+
target[i] = f(data[:, i])
303+
end
304+
return target
305+
end
306+
307+
300308

301309
"""
302310

src/mve.jl

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,28 +8,26 @@ import LinearAlgebra: diag, det
88
import Distributions: median, cov, mean, quantile, sample, Chisq
99

1010
import ..Basis:
11-
RegressionSetting, @extractRegressionSetting, designMatrix, responseVector, applyColumns
11+
RegressionSetting,
12+
@extractRegressionSetting, designMatrix, responseVector, applyColumns, applyColumns!
13+
1214
import ..Diagnostics: mahalanobisSquaredMatrix
1315

1416

1517
function enlargesubset(initialsubset, data::AbstractMatrix, h::Int)
16-
n, p = size(data)
18+
p = size(data, 2)
1719

1820
basicsubset = copy(initialsubset)
1921

2022
meanvector = Array{Float64}(undef, p)
21-
covmatrix = Matrix{Float64}(undef, p, p)
22-
md2mat = Matrix{Float64}(undef, n, n)
23-
md2 = Array{Float64}(undef, n)
24-
md2sortedindex = Array{Int}(undef, n)
2523

2624
while length(basicsubset) < h
27-
meanvector .= applyColumns(mean, data[basicsubset, :])
28-
covmatrix .= cov(data[basicsubset, :])
29-
md2mat .=
25+
applyColumns!(meanvector, mean, data[basicsubset, :])
26+
covmatrix = cov(data[basicsubset, :])
27+
md2mat =
3028
mahalanobisSquaredMatrix(data, meanvector = meanvector, covmatrix = covmatrix)
31-
md2 .= diag(md2mat)
32-
md2sortedindex .= sortperm(md2)
29+
md2 = diag(md2mat)
30+
md2sortedindex = sortperm(md2)
3331
basicsubset = md2sortedindex[1:(length(basicsubset)+1)]
3432
end
3533
return basicsubset
@@ -55,21 +53,22 @@ function robcov(data::Matrix; alpha = 0.01, estimator = :mve)
5553
hsubset = Array{Int}(undef, h)
5654
besthsubset = Array{Int}(undef, h)
5755

58-
covmatrix = Matrix{Float64}(undef, p, p)
56+
5957
meanvector = Array{Float64}(undef, p)
60-
md2mat = Matrix{Float64}(undef, n, n)
58+
fill!(meanvector, 0.0)
6159

62-
md2 = Array{Float64}(undef, n)
6360

6461
for iter = 1:maxiter
6562
goal = Inf
63+
64+
6665
try
67-
initialsubset .= sample(indices, k, replace = false)
68-
hsubset .= enlargesubset(initialsubset, data, h)
69-
covmatrix .= cov(data[hsubset, :])
66+
initialsubset = sample(indices, k, replace = false)
67+
hsubset = enlargesubset(initialsubset, data, h)
68+
covmatrix = cov(data[hsubset, :])
7069
if estimator == :mve
71-
meanvector .= applyColumns(mean, data[hsubset, :])
72-
md2mat .= mahalanobisSquaredMatrix(
70+
applyColumns!(meanvector, mean, data[hsubset, :])
71+
md2mat = mahalanobisSquaredMatrix(
7372
data,
7473
meanvector = meanvector,
7574
covmatrix = covmatrix,
@@ -82,17 +81,20 @@ function robcov(data::Matrix; alpha = 0.01, estimator = :mve)
8281
catch e
8382
# Possibly singularity
8483
end
84+
85+
8586
if goal < mingoal
8687
mingoal = goal
87-
bestinitialsubset .= initialsubset
88-
besthsubset .= hsubset
88+
bestinitialsubset = initialsubset
89+
besthsubset = hsubset
8990
end
9091
end
9192

9293

93-
meanvector .= applyColumns(mean, data[besthsubset, :])
94-
covmatrix .= cov(data[besthsubset, :])
95-
md2 .= diag(
94+
95+
applyColumns!(meanvector, mean, data[besthsubset, :])
96+
covmatrix = cov(data[besthsubset, :])
97+
md2 = diag(
9698
mahalanobisSquaredMatrix(
9799
data,
98100
meanvector = meanvector,

0 commit comments

Comments
 (0)