es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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:

enter image description here

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?

Tags:  , ,

Answer

  1. Avatar for 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 el min() y el max() de las columnas con índices especificados, podemos usar el operador [ para extraer la submatriz requerida y luego aplicar las funciones usando la función apply() en la dimensión respectiva. Aquí hay un fragmento de código modificado que debería funcionar como se espera:

    # datos de entrada
    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")))
    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")))
    i <- c("4", "9")
    j <- c("8", "10")
    r <- c("1", "5", "7")
    
    # extraer las submatrices requeridas
    D1_sub <- D1[i, r]
    D2_sub <- D2[j, r]
    
    # calcular el min y el max para las columnas con los índices especificados
    x <- apply(D1_sub + D2_sub, 2, min)
    y <- apply(abs(D1_sub - D2_sub), 2, max)
    
    # calcular la matriz de salida
    D <- 2 * x * y / (x + y)
    
    # salida
    D
    

    Esto debería dar como resultado una matriz simétrica de 2×2 como salida.

Comments are closed.