Cómo encontrar el mínimo/máximo para las columnas de una matriz con índices especificados?
Estoy leyendo el artículo e intento implementar el algoritmo 2:
donde ave(x,y)=2xy/(x+y).
He encontrado D1, D2:
> dput(D1)
structure(c(0, 0, 0.316227766016838, 0.316227766016838, 0.316227766016838,
0, 0, 0.316227766016838, 0.316227766016838, 0.316227766016838,
0.316227766016838, 0.316227766016838, 0, 0.316227766016838, 0.447213595499958,
0.316227766016838, 0.316227766016838, 0.316227766016838, 0, 0.316227766016838,
0.316227766016838, 0.316227766016838, 0.447213595499958, 0.316227766016838,
0), .Dim = c(5L, 5L), .Dimnames = list(c("1", "4", "5", "7",
"9"), c("1", "4", "5", "7", "9")))
> dput(D2)
structure(c(0, 0.447213595499958, 0.316227766016838, 0, 0.447213595499958,
0.447213595499958, 0, 0.316227766016838, 0.447213595499958, 0,
0.316227766016838, 0.316227766016838, 0, 0.316227766016838, 0.316227766016838,
0, 0.447213595499958, 0.316227766016838, 0, 0.447213595499958,
0.447213595499958, 0, 0.316227766016838, 0.447213595499958, 0
), .Dim = c(5L, 5L), .Dimnames = list(c("1", "5", "7", "8", "10"
), c("1", "5", "7", "8", "10")))
Luego he definido los índices i, j y r:
> dput(i)
c("4", "9")
> dput(j)
c("8", "10")
> dput(r)
c("1", "5", "7")
y finalmente
k = length(I)
D = matrix(0, k, k)
x = min( D1[i, r] + D2[j, r])
y = max(abs(D1[i, r] - D2[j, r]))
D = 2*x*y/(x+y)
Se espera una matriz simétrica de 2×2 como respuesta, pero obtengo
> D
[1] 0
También he intentado usar la función apply
:
x = apply( D1+D2, 1, function(x) min(x))
y = apply(abs( D1-D2 ), 1, function(x) max(x))
D = 2*x*y/(x+y)
La respuesta es el vector:
> D
1 4 5 7 9
0 0 0 0 0
Pregunta: ¿Cómo encontrar min()
y max()
para las columnas con índices especificados?
davy.ai
Según el código proporcionado, la variable
D
se vuelve a definir en el último paso en lugar de calcular los valores requeridos en los índices especificados. Para encontrar elmin()
y elmax()
de las columnas con índices especificados, podemos usar el operador[
para extraer la submatriz requerida y luego aplicar las funciones usando la funciónapply()
en la dimensión respectiva. Aquí hay un fragmento de código modificado que debería funcionar como se espera:Esto debería dar como resultado una matriz simétrica de 2×2 como salida.