Skip to content

Commit 63912a2

Browse files
committed
reduce memory allocations in hadi92 and hadi94
1 parent 6a42574 commit 63912a2

3 files changed

Lines changed: 32 additions & 16 deletions

File tree

CHANGELOG.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
- More explicit return types, drop `Dict` with `Dict{String, Any}` or `Dict{String, Vector}`
44
- Add `Julia v.1.10` to GitHub actions
5-
- Reduce memory allocation in `lts()` and `lms()`
6-
5+
- Reduce memory allocations in `lts()` and `lms()`
6+
- Reduce memory allocations in `hadi92()` and `hadi94()`
77

88
# v0.11.3
99

src/hadi1992.jl

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -109,30 +109,37 @@ function hadi1992(multivariateData::AbstractMatrix{Float64}; alpha = 0.05)
109109
basic_subset = []
110110
sorted_mah1 = []
111111

112+
Cb = zeros(Float64, p)
113+
Sb = zeros(Float64, p, p)
114+
newSb = zeros(Float64, p, p)
115+
116+
msm3 = zeros(Float64, n, n)
117+
msm4 = zeros(Float64, n, n)
118+
112119
while r < n
113120
cnpr = 1 + (r / (n - p))^2.0
114121
basic_subset_indices = ordering_indices_mah1[1:r]
115122
basic_subset = multivariateData[basic_subset_indices, :]
116-
Cb = applyColumns(mean, basic_subset)
117-
Sb = cov(basic_subset)
123+
Cb .= applyColumns(mean, basic_subset)
124+
Sb .= cov(basic_subset)
118125

119126
r += 1
120127
cfactor = cnpr * sqrt(sort(mah1)[h]) / chi_50_quantile
121128
if det(cfactor * Sb) == 0
122129
@info "singular Sb case"
123-
newSb = hadi1992_handle_singularity(cfactor * Sb)
130+
newSb .= hadi1992_handle_singularity(cfactor * Sb)
124131

125-
msm3 = mahalanobisSquaredMatrix(multivariateData, meanvector = Cb, covmatrix = newSb,)
132+
msm3 .= mahalanobisSquaredMatrix(multivariateData, meanvector = Cb, covmatrix = newSb,)
126133
@assert !isnothing(msm3)
127134

128-
mah1 = diag(msm3)
135+
mah1 .= diag(msm3)
129136

130137
ordering_indices_mah1 = sortperm(mah1)
131138
basic_subset_indices = ordering_indices_mah1[1:r]
132139
else
133-
msm4 = mahalanobisSquaredMatrix(multivariateData, meanvector = Cb, covmatrix = (cfactor * Sb))
140+
msm4 .= mahalanobisSquaredMatrix(multivariateData, meanvector = Cb, covmatrix = (cfactor * Sb))
134141
@assert !isnothing(msm4)
135-
mah1 = diag(msm4)
142+
mah1 .= diag(msm4)
136143
ordering_indices_mah1 = sortperm(mah1)
137144
basic_subset_indices = ordering_indices_mah1[1:r]
138145
end

src/hadi1994.jl

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -76,11 +76,18 @@ function hadi1994(multivariateData::AbstractMatrix{Float64}; alpha = 0.05)
7676
ordering_indices_mah1 = sortperm(mah1)
7777

7878
r = p + 1
79-
basic_subset_indices = []
79+
80+
basic_subset_indices = Int[]
81+
8082
basic_subset = []
83+
8184
sorted_mah1 = []
82-
Cb = []
83-
Sb = []
85+
86+
Cb = zeros(Float64, p)
87+
Sb = zeros(Float64, p, p)
88+
msm3 = zeros(Float64, n, n)
89+
sorted_mah1 = zeros(Float64, n)
90+
8491
cfactor = 0
8592
isFullRank = false
8693

@@ -91,8 +98,8 @@ function hadi1994(multivariateData::AbstractMatrix{Float64}; alpha = 0.05)
9198
while !isFullRank
9299
basic_subset_indices = ordering_indices_mah1[1:r]
93100
basic_subset = multivariateData[basic_subset_indices, :]
94-
Cb = applyColumns(mean, basic_subset)
95-
Sb = cov(basic_subset)
101+
Cb .= applyColumns(mean, basic_subset)
102+
Sb .= cov(basic_subset)
96103
cfactor = cnp * sqrt(sort(mah1)[h]) / chi_50_quantile
97104
r += 1
98105

@@ -103,19 +110,21 @@ function hadi1994(multivariateData::AbstractMatrix{Float64}; alpha = 0.05)
103110
end
104111
end
105112

106-
msm3 = mahalanobisSquaredMatrix(
113+
msm3 .= mahalanobisSquaredMatrix(
107114
multivariateData,
108115
meanvector = Cb,
109116
covmatrix = (cfactor * Sb),
110117
)
118+
111119
@assert !isnothing(msm3)
112120

113121
mah1 = diag(msm3)
114122

115123
ordering_indices_mah1 = sortperm(mah1)
116124
basic_subset_indices = ordering_indices_mah1[1:r]
117125

118-
sorted_mah1 = sort(mah1)
126+
sorted_mah1 .= sort(mah1)
127+
119128
if sorted_mah1[r] >= critical_quantile
120129
break
121130
end

0 commit comments

Comments
 (0)