@@ -23,7 +23,9 @@ lav_matrix_vecr <- function(A) {
23
23
# faster way??
24
24
# nRow <- NROW(A); nCol <- NCOL(A)
25
25
# idx <- (seq_len(nCol) - 1L) * nRow + rep(seq_len(nRow), each = nCol)
26
-
26
+ if (lav_use_lavaanC() && is.numeric(A )) {
27
+ return (lavaanC :: m_vecr(A ))
28
+ }
27
29
lav_matrix_vec(t(A ))
28
30
}
29
31
@@ -39,6 +41,9 @@ lav_matrix_vecr <- function(A) {
39
41
# M&N book: page 48-49
40
42
#
41
43
lav_matrix_vech <- function (S , diagonal = TRUE ) {
44
+ if (lav_use_lavaanC() && is.numeric(S )) {
45
+ return (lavaanC :: m_vech(S , diagonal ))
46
+ }
42
47
ROW <- row(S )
43
48
COL <- col(S )
44
49
if (diagonal ) S [ROW > = COL ] else S [ROW > COL ]
@@ -49,6 +54,9 @@ lav_matrix_vech <- function(S, diagonal = TRUE) {
49
54
# into a vector by stacking the *rows* of the matrix one after the
50
55
# other, but eliminating all supradiagonal elements
51
56
lav_matrix_vechr <- function (S , diagonal = TRUE ) {
57
+ if (lav_use_lavaanC() && is.numeric(S )) {
58
+ return (lavaanC :: m_vechr(S , diagonal ))
59
+ }
52
60
S [lav_matrix_vechr_idx(n = NCOL(S ), diagonal = diagonal )]
53
61
}
54
62
@@ -57,26 +65,31 @@ lav_matrix_vechr <- function(S, diagonal = TRUE) {
57
65
# into a vector by stacking the *columns* of the matrix one after the
58
66
# other, but eliminating all infradiagonal elements
59
67
lav_matrix_vechu <- function (S , diagonal = TRUE ) {
68
+ if (lav_use_lavaanC() && is.numeric(S )) {
69
+ return (lavaanC :: m_vechu(S , diagonal ))
70
+ }
60
71
S [lav_matrix_vechu_idx(n = NCOL(S ), diagonal = diagonal )]
61
72
}
62
73
63
-
64
74
# the vechru operator transforms a *symmetric* matrix
65
75
# into a vector by stacking the *rows* of the matrix one after the
66
76
# other, but eliminating all infradiagonal elements
67
77
#
68
78
# same as vech (but using upper-diagonal elements)
69
79
lav_matrix_vechru <- function (S , diagonal = TRUE ) {
80
+ if (lav_use_lavaanC() && is.numeric(S )) {
81
+ return (lavaanC :: m_vechru(S , diagonal ))
82
+ }
70
83
S [lav_matrix_vechru_idx(n = NCOL(S ), diagonal = diagonal )]
71
84
}
72
85
73
-
74
-
75
-
76
86
# return the *vector* indices of the lower triangular elements of a
77
87
# symmetric matrix of size 'n'
78
88
lav_matrix_vech_idx <- function (n = 1L , diagonal = TRUE ) {
79
89
n <- as.integer(n )
90
+ if (lav_use_lavaanC() && n > 1L ) {
91
+ return (lavaanC :: m_vech_idx(n , diagonal ))
92
+ }
80
93
if (n < 100L ) {
81
94
ROW <- matrix (seq_len(n ), n , n )
82
95
COL <- matrix (seq_len(n ), n , n , byrow = TRUE )
@@ -101,6 +114,9 @@ lav_matrix_vech_idx <- function(n = 1L, diagonal = TRUE) {
101
114
# symmetric matrix of size 'n'
102
115
lav_matrix_vech_row_idx <- function (n = 1L , diagonal = TRUE ) {
103
116
n <- as.integer(n )
117
+ if (lav_use_lavaanC() && n > 1L ) {
118
+ return (lavaanC :: m_vech_row_idx(n , diagonal ))
119
+ }
104
120
if (diagonal ) {
105
121
unlist(lapply(seq_len(n ), seq.int , n ))
106
122
} else {
@@ -112,6 +128,9 @@ lav_matrix_vech_row_idx <- function(n = 1L, diagonal = TRUE) {
112
128
# symmetric matrix of size 'n'
113
129
lav_matrix_vech_col_idx <- function (n = 1L , diagonal = TRUE ) {
114
130
n <- as.integer(n )
131
+ if (lav_use_lavaanC() && n > 1L ) {
132
+ return (lavaanC :: m_vech_col_idx(n , diagonal ))
133
+ }
115
134
if (! diagonal ) {
116
135
n <- n - 1L
117
136
}
@@ -125,6 +144,9 @@ lav_matrix_vech_col_idx <- function(n = 1L, diagonal = TRUE) {
125
144
# symmetric matrix of size 'n' -- ROW-WISE
126
145
lav_matrix_vechr_idx <- function (n = 1L , diagonal = TRUE ) {
127
146
n <- as.integer(n )
147
+ if (lav_use_lavaanC() && n > 1L ) {
148
+ return (lavaanC :: m_vechr_idx(n , diagonal ))
149
+ }
128
150
if (n < 100L ) {
129
151
ROW <- matrix (seq_len(n ), n , n )
130
152
COL <- matrix (seq_len(n ), n , n , byrow = TRUE )
@@ -149,6 +171,9 @@ lav_matrix_vechr_idx <- function(n = 1L, diagonal = TRUE) {
149
171
# symmetric matrix of size 'n' -- COLUMN-WISE
150
172
lav_matrix_vechu_idx <- function (n = 1L , diagonal = TRUE ) {
151
173
n <- as.integer(n )
174
+ if (lav_use_lavaanC() && n > 1L ) {
175
+ return (lavaanC :: m_vechu_idx(n , diagonal ))
176
+ }
152
177
if (n < 100L ) {
153
178
ROW <- matrix (seq_len(n ), n , n )
154
179
COL <- matrix (seq_len(n ), n , n , byrow = TRUE )
@@ -166,6 +191,9 @@ lav_matrix_vechu_idx <- function(n = 1L, diagonal = TRUE) {
166
191
# symmetric matrix of size 'n' -- ROW-WISE
167
192
lav_matrix_vechru_idx <- function (n = 1L , diagonal = TRUE ) {
168
193
n <- as.integer(n )
194
+ if (lav_use_lavaanC() && n > 1L ) {
195
+ return (lavaanC :: m_vechru_idx(n , diagonal ))
196
+ }
169
197
if (n < 100L ) {
170
198
# FIXME!! make this more efficient (without creating 3 n*n matrices!)
171
199
ROW <- matrix (seq_len(n ), n , n )
@@ -196,6 +224,9 @@ lav_matrix_vechru_idx <- function(n = 1L, diagonal = TRUE) {
196
224
lav_matrix_vech_reverse <- lav_matrix_vechru_reverse <-
197
225
lav_matrix_upper2full <-
198
226
function (x , diagonal = TRUE ) {
227
+ if (lav_use_lavaanC()) {
228
+ return (lavaanC :: m_vech_reverse(x , diagonal ))
229
+ }
199
230
# guess dimensions
200
231
if (diagonal ) {
201
232
p <- (sqrt(1 + 8 * length(x )) - 1 ) / 2
@@ -218,6 +249,9 @@ lav_matrix_vech_reverse <- lav_matrix_vechru_reverse <-
218
249
# reconstruct S
219
250
lav_matrix_vechr_reverse <- lav_matrix_vechu_reverse <-
220
251
lav_matrix_lower2full <- function (x , diagonal = TRUE ) {
252
+ if (lav_use_lavaanC()) {
253
+ return (lavaanC :: m_vechr_reverse(x , diagonal ))
254
+ }
221
255
# guess dimensions
222
256
if (diagonal ) {
223
257
p <- (sqrt(1 + 8 * length(x )) - 1 ) / 2
@@ -239,19 +273,27 @@ lav_matrix_vechr_reverse <- lav_matrix_vechu_reverse <-
239
273
# matrix of size 'n'
240
274
lav_matrix_diag_idx <- function (n = 1L ) {
241
275
# if(n < 1L) return(integer(0L))
276
+ n <- as.integer(n )
277
+ if (lav_use_lavaanC()) {
278
+ return (lavaanC :: m_diag_idx(n ))
279
+ }
242
280
1L + (seq_len(n ) - 1L ) * (n + 1L )
243
281
}
244
282
245
283
246
284
# return the *vector* indices of the diagonal elements of the LOWER part
247
285
# of a symmatrix matrix of size 'n'
248
286
lav_matrix_diagh_idx <- function (n = 1L ) {
287
+ n <- as.integer(n )
249
288
if (n < 1L ) {
250
289
return (integer(0L ))
251
290
}
252
291
if (n == 1L ) {
253
292
return (1L )
254
293
}
294
+ if (lav_use_lavaanC()) {
295
+ return (lavaanC :: m_diagh_idx(n ))
296
+ }
255
297
c(1L , cumsum(n : 2L ) + 1L )
256
298
}
257
299
@@ -262,6 +304,9 @@ lav_matrix_antidiag_idx <- function(n = 1L) {
262
304
if (n < 1L ) {
263
305
return (integer(0L ))
264
306
}
307
+ if (lav_use_lavaanC()) {
308
+ return (lavaanC :: m_antidiag_idx(n ))
309
+ }
265
310
1L + seq_len(n ) * (n - 1L )
266
311
}
267
312
@@ -294,6 +339,10 @@ lav_matrix_vech_which_idx <- function(n = 1L, diagonal = TRUE,
294
339
return (integer(0L ))
295
340
}
296
341
n <- as.integer(n )
342
+ idx <- as.integer(idx )
343
+ if (lav_use_lavaanC()) {
344
+ return (lavaanC :: m_vech_which_idx(n , diagonal , idx , type , add.idx.at.start ))
345
+ }
297
346
A <- matrix (FALSE , n , n )
298
347
if (type == " and" ) {
299
348
A [idx , idx ] <- TRUE
@@ -319,6 +368,10 @@ lav_matrix_vech_match_idx <- function(n = 1L, diagonal = TRUE,
319
368
return (integer(0L ))
320
369
}
321
370
n <- as.integer(n )
371
+ idx <- as.integer(idx )
372
+ if (lav_use_lavaanC()) {
373
+ return (lavaanC :: m_vech_match_idx(n , diagonal , idx ))
374
+ }
322
375
pstar <- n * (n + 1 ) / 2
323
376
A <- lav_matrix_vech_reverse(seq_len(pstar ))
324
377
B <- A [idx , idx , drop = FALSE ]
@@ -329,7 +382,9 @@ lav_matrix_vech_match_idx <- function(n = 1L, diagonal = TRUE,
329
382
lav_matrix_is_diagonal <- function (A = NULL ) {
330
383
A <- as.matrix.default(A )
331
384
stopifnot(nrow(A ) == ncol(A ))
332
-
385
+ if (lav_use_lavaanC()) {
386
+ return (lavaanC :: m_is_diagonal(A ))
387
+ }
333
388
diag(A ) <- 0
334
389
all(A == 0 )
335
390
}
@@ -413,6 +468,10 @@ lav_matrix_is_diagonal <- function(A = NULL) {
413
468
# dup3: using col idx only
414
469
# D7 <- dup(7L); x<- apply(D7, 1, function(x) which(x > 0)); matrix(x,7,7)
415
470
.dup3 <- function (n = 1L ) {
471
+ n <- as.integer(n )
472
+ if (lav_use_lavaanC()) {
473
+ return (lavaanC :: m_duplication(n ))
474
+ }
416
475
if ((n < 1L ) || (round(n ) != n )) {
417
476
lav_msg_stop(gettext(" n must be a positive integer" ))
418
477
}
@@ -468,6 +527,10 @@ lav_matrix_duplication <- .dup3
468
527
# - it returns a matrix of size p^2 * (p*(p-1))/2
469
528
# - the columns corresponding to the diagonal elements have been removed
470
529
lav_matrix_duplication_cor <- function (n = 1L ) {
530
+ n <- as.integer(n )
531
+ if (lav_use_lavaanC()) {
532
+ return (lavaanC :: m_duplication_cor(n ))
533
+ }
471
534
out <- lav_matrix_duplication(n = n )
472
535
diag.idx <- lav_matrix_diagh_idx(n = n )
473
536
out [, - diag.idx , drop = FALSE ]
@@ -477,6 +540,9 @@ lav_matrix_duplication_cor <- function(n = 1L) {
477
540
# sqrt(nrow(A)) is an integer
478
541
# A is not symmetric, and not even square, only n^2 ROWS
479
542
lav_matrix_duplication_pre <- function (A = matrix (0 , 0 , 0 )) {
543
+ if (lav_use_lavaanC()) {
544
+ return (lavaanC :: m_duplication_pre(A ))
545
+ }
480
546
# number of rows
481
547
n2 <- NROW(A )
482
548
@@ -524,6 +590,9 @@ lav_matrix_duplication_dup_pre2 <- function(A = matrix(0, 0, 0)) {
524
590
# A is not symmetric, and not even square, only n^2 ROWS
525
591
# correlation version: ignoring diagonal elements
526
592
lav_matrix_duplication_cor_pre <- function (A = matrix (0 , 0 , 0 )) {
593
+ if (lav_use_lavaanC()) {
594
+ return (lavaanC :: m_duplication_cor_pre(A ))
595
+ }
527
596
# number of rows
528
597
n2 <- NROW(A )
529
598
@@ -548,6 +617,9 @@ lav_matrix_duplication_cor_pre <- function(A = matrix(0, 0, 0)) {
548
617
# sqrt(ncol(A)) must be an integer
549
618
# A is not symmetric, and not even square, only n^2 COLUMNS
550
619
lav_matrix_duplication_post <- function (A = matrix (0 , 0 , 0 )) {
620
+ if (lav_use_lavaanC()) {
621
+ return (lavaanC :: m_duplication_post(A ))
622
+ }
551
623
# number of columns
552
624
n2 <- NCOL(A )
553
625
@@ -573,6 +645,9 @@ lav_matrix_duplication_post <- function(A = matrix(0, 0, 0)) {
573
645
# A is not symmetric, and not even square, only n^2 COLUMNS
574
646
# correlation version: ignoring the diagonal elements
575
647
lav_matrix_duplication_cor_post <- function (A = matrix (0 , 0 , 0 )) {
648
+ if (lav_use_lavaanC()) {
649
+ return (lavaanC :: m_duplication_cor_post(A ))
650
+ }
576
651
# number of columns
577
652
n2 <- NCOL(A )
578
653
@@ -597,6 +672,9 @@ lav_matrix_duplication_cor_post <- function(A = matrix(0, 0, 0)) {
597
672
# compute t(D) %*% A %*% D (without explicitly computing D)
598
673
# A must be a square matrix and sqrt(ncol) an integer
599
674
lav_matrix_duplication_pre_post <- function (A = matrix (0 , 0 , 0 )) {
675
+ if (lav_use_lavaanC()) {
676
+ return (lavaanC :: m_duplication_pre_post(A ))
677
+ }
600
678
# number of columns
601
679
n2 <- NCOL(A )
602
680
@@ -623,6 +701,9 @@ lav_matrix_duplication_pre_post <- function(A = matrix(0, 0, 0)) {
623
701
# A must be a square matrix and sqrt(ncol) an integer
624
702
# correlation version: ignoring diagonal elements
625
703
lav_matrix_duplication_cor_pre_post <- function (A = matrix (0 , 0 , 0 )) {
704
+ if (lav_use_lavaanC()) {
705
+ return (lavaanC :: m_duplication_cor_pre_post(A ))
706
+ }
626
707
# number of columns
627
708
n2 <- NCOL(A )
628
709
@@ -772,6 +853,10 @@ lav_matrix_elimination_pre_post <- function(A = matrix(0, 0, 0)) {
772
853
773
854
# create DUP.ginv without transpose
774
855
.dup_ginv2 <- function (n = 1L ) {
856
+ if (lav_use_lavaanC()) {
857
+ n <- as.integer(n )
858
+ return (lavaanC :: m_duplication_ginv(n ))
859
+ }
775
860
if ((n < 1L ) || (round(n ) != n )) {
776
861
lav_msg_stop(gettext(" n must be a positive integer" ))
777
862
}
@@ -840,7 +925,9 @@ lav_matrix_duplication_ginv_post <- function(A = matrix(0, 0, 0)) {
840
925
# for square matrices only, with ncol = nrow = n^2
841
926
lav_matrix_duplication_ginv_pre_post <- function (A = matrix (0 , 0 , 0 )) {
842
927
A <- as.matrix.default(A )
843
-
928
+ if (lav_use_lavaanC()) {
929
+ return (lavaanC :: m_duplication_ginv_pre_post(A ))
930
+ }
844
931
# number of columns
845
932
n2 <- NCOL(A )
846
933
@@ -902,6 +989,12 @@ lav_matrix_duplication_ginv_cor_pre_post <- function(A = matrix(0, 0, 0)) {
902
989
903
990
# first attempt
904
991
.com1 <- function (m = 1L , n = 1L ) {
992
+ if (lav_use_lavaanC()) {
993
+ m <- as.integer(m )
994
+ n <- as.integer(n )
995
+ return (lavaanC :: m_commutation(m , n ))
996
+ }
997
+
905
998
if ((m < 1L ) || (round(m ) != m )) {
906
999
lav_msg_stop(gettext(" n must be a positive integer" ))
907
1000
}
@@ -929,6 +1022,10 @@ lav_matrix_commutation <- .com1
929
1022
# = permuting the rows of A
930
1023
lav_matrix_commutation_pre <- function (A = matrix (0 , 0 , 0 )) {
931
1024
A <- as.matrix(A )
1025
+
1026
+ if (lav_use_lavaanC()) {
1027
+ return (lavaanC :: m_commutation_pre(A ))
1028
+ }
932
1029
933
1030
# number of rows of A
934
1031
n2 <- nrow(A )
@@ -952,6 +1049,10 @@ lav_matrix_commutation_pre <- function(A = matrix(0, 0, 0)) {
952
1049
# = permuting the columns of A
953
1050
lav_matrix_commutation_post <- function (A = matrix (0 , 0 , 0 )) {
954
1051
A <- as.matrix(A )
1052
+
1053
+ if (lav_use_lavaanC()) {
1054
+ return (lavaanC :: m_commutation_post(A ))
1055
+ }
955
1056
956
1057
# number of columns of A
957
1058
n2 <- ncol(A )
@@ -975,7 +1076,9 @@ lav_matrix_commutation_post <- function(A = matrix(0, 0, 0)) {
975
1076
# = permuting both the rows AND columns of A
976
1077
lav_matrix_commutation_pre_post <- function (A = matrix (0 , 0 , 0 )) {
977
1078
A <- as.matrix(A )
978
-
1079
+ if (lav_use_lavaanC()) {
1080
+ return (lavaanC :: m_commutation_pre_post(A ))
1081
+ }
979
1082
# number of columns of A
980
1083
n2 <- NCOL(A )
981
1084
0 commit comments