This function optimizes the sum of the matrix `m * I`, where `I` is a binary indicator matrix with the constraint that each column may have only one non-zero entry. It ensures that the distribution of 1's is uniform across rows, softens the constraint to avoid infinite loops, and includes an optional verbose output to report the progress of the optimization.

optimize_indicator_matrix(
  m,
  max_iter = 1000,
  tol = 1e-06,
  preprocess = TRUE,
  verbose = FALSE
)

Arguments

m

A numeric matrix to optimize.

max_iter

The maximum number of iterations to avoid infinite loops. Default is 1000.

tol

A numeric value representing the tolerance for convergence. If the change in the objective function is less than this value, the loop stops. Default is 1e-6.

preprocess

Logical. If TRUE, flips the sign of each row where the entries are predominantly negative.

verbose

Logical. If TRUE, reports the objective value and convergence progress at each iteration.

Value

`m * I`

Examples

set.seed(123)
m <- matrix(rnorm(500), nrow = 5)
result <- optimize_indicator_matrix(m, max_iter = 1000, tol = 1e-6, verbose = TRUE)
#> Iteration: 1 | Objective Value: 5.05635614330686
#> Converged in 2 iterations with objective value: 5.05635614330686
print(result)
#>          [,1]     [,2]      [,3]      [,4]      [,5] [,6] [,7] [,8] [,9] [,10]
#> [1,] 0.000000 1.715065 0.0000000 0.0000000 0.0000000    0    0    0    0     0
#> [2,] 0.000000 0.000000 0.0000000 0.4978505 0.0000000    0    0    0    0     0
#> [3,] 1.558708 0.000000 0.0000000 0.0000000 0.0000000    0    0    0    0     0
#> [4,] 0.000000 0.000000 0.0000000 0.0000000 0.7288912    0    0    0    0     0
#> [5,] 0.000000 0.000000 0.5558411 0.0000000 0.0000000    0    0    0    0     0
#>      [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22]
#> [1,]     0     0     0     0     0     0     0     0     0     0     0     0
#> [2,]     0     0     0     0     0     0     0     0     0     0     0     0
#> [3,]     0     0     0     0     0     0     0     0     0     0     0     0
#> [4,]     0     0     0     0     0     0     0     0     0     0     0     0
#> [5,]     0     0     0     0     0     0     0     0     0     0     0     0
#>      [,23] [,24] [,25] [,26] [,27] [,28] [,29] [,30] [,31] [,32] [,33] [,34]
#> [1,]     0     0     0     0     0     0     0     0     0     0     0     0
#> [2,]     0     0     0     0     0     0     0     0     0     0     0     0
#> [3,]     0     0     0     0     0     0     0     0     0     0     0     0
#> [4,]     0     0     0     0     0     0     0     0     0     0     0     0
#> [5,]     0     0     0     0     0     0     0     0     0     0     0     0
#>      [,35] [,36] [,37] [,38] [,39] [,40] [,41] [,42] [,43] [,44] [,45] [,46]
#> [1,]     0     0     0     0     0     0     0     0     0     0     0     0
#> [2,]     0     0     0     0     0     0     0     0     0     0     0     0
#> [3,]     0     0     0     0     0     0     0     0     0     0     0     0
#> [4,]     0     0     0     0     0     0     0     0     0     0     0     0
#> [5,]     0     0     0     0     0     0     0     0     0     0     0     0
#>      [,47] [,48] [,49] [,50] [,51] [,52] [,53] [,54] [,55] [,56] [,57] [,58]
#> [1,]     0     0     0     0     0     0     0     0     0     0     0     0
#> [2,]     0     0     0     0     0     0     0     0     0     0     0     0
#> [3,]     0     0     0     0     0     0     0     0     0     0     0     0
#> [4,]     0     0     0     0     0     0     0     0     0     0     0     0
#> [5,]     0     0     0     0     0     0     0     0     0     0     0     0
#>      [,59] [,60] [,61] [,62] [,63] [,64] [,65] [,66] [,67] [,68] [,69] [,70]
#> [1,]     0     0     0     0     0     0     0     0     0     0     0     0
#> [2,]     0     0     0     0     0     0     0     0     0     0     0     0
#> [3,]     0     0     0     0     0     0     0     0     0     0     0     0
#> [4,]     0     0     0     0     0     0     0     0     0     0     0     0
#> [5,]     0     0     0     0     0     0     0     0     0     0     0     0
#>      [,71] [,72] [,73] [,74] [,75] [,76] [,77] [,78] [,79] [,80] [,81] [,82]
#> [1,]     0     0     0     0     0     0     0     0     0     0     0     0
#> [2,]     0     0     0     0     0     0     0     0     0     0     0     0
#> [3,]     0     0     0     0     0     0     0     0     0     0     0     0
#> [4,]     0     0     0     0     0     0     0     0     0     0     0     0
#> [5,]     0     0     0     0     0     0     0     0     0     0     0     0
#>      [,83] [,84] [,85] [,86] [,87] [,88] [,89] [,90] [,91] [,92] [,93] [,94]
#> [1,]     0     0     0     0     0     0     0     0     0     0     0     0
#> [2,]     0     0     0     0     0     0     0     0     0     0     0     0
#> [3,]     0     0     0     0     0     0     0     0     0     0     0     0
#> [4,]     0     0     0     0     0     0     0     0     0     0     0     0
#> [5,]     0     0     0     0     0     0     0     0     0     0     0     0
#>      [,95] [,96] [,97] [,98] [,99] [,100]
#> [1,]     0     0     0     0     0      0
#> [2,]     0     0     0     0     0      0
#> [3,]     0     0     0     0     0      0
#> [4,]     0     0     0     0     0      0
#> [5,]     0     0     0     0     0      0