7
votes

Obtenez le dernier élément d'une matrice

considérer que j'ai suivi matricielle xxx

je veux juste trouver le dernier élément, c'est-à-dire m [3, 3]

comme ça La colonne matricielle et la taille de la ligne sont dynamiques, nous ne pouvons pas le calculer à M [3, 3]

Comment puis-je obtenir la valeur du dernier élément?

Actuellement, j'ai fait à l'aide du code ci-dessous xxx

existe un meilleur moyen de le faire?


0 commentaires

3 Réponses :


17
votes

une matrice en r est juste un vecteur avec un attribut DIM code>, afin que vous puissiez simplement le sous-ensemble comme un xxx pré>


si mentionné (comme mentionné par @James) Votre solution pourrait être plus générale au cas où vous voulez vous garder la structure matricielle, comme vous pouvez ajouter drop = false code> p> xxx pré>

cependant, Ma solution pourrait également être modifiée de la même manière à l'aide de la fonction Dim Fonction de remplacement P>

M <- matrix(runif(1000000),nrow=1000)

microbenchmark(
  nrow_ncol={
    M[nrow(M),ncol(M)]
  },
  dim12={
    M[dim(M)[1],dim(M)[2]]
  },
  length1={
    M[length(M)]
  },
  tail1={
    tail(c(M),1)
  },
  times = 1000
)

# Unit: nanoseconds
#      expr     min      lq        mean    median      uq      max neval cld
# nrow_ncol     605    1209    3799.908    3623.0    6038    27167  1000   a 
#     dim12     302     605    2333.241    1811.0    3623    19922  1000   a 
#   length1       0     303    2269.564    1510.5    3925    14792  1000   a 
#    tail 1 3103005 3320034 4022028.561 3377234.0 3467487 42777080  1000   b


11 commentaires

Mais la méthode proposée par OP est parfaitement correcte et est légèrement moins obscurcissant l'intention.


@Roland je suis d'accord c'est "ok" mais je pense que op ne réalise pas qu'il ne traite qu'un vecteur et sa chose importante à réaliser lorsqu'il s'agit de matrices dans R.


Sûr. Mon commentaire était simplement un addenda. J'ai déjà évoqué (et je préparais la même réponse).


Avec la méthode d'indexation de vecteur, vous ne pouvez pas éviter de laisser tomber la classe matricielle, ce qui peut être important.


@James m [nrow (m), ncol (m)] tomber aussi comme pour attributs (m [nrow (m), ncol (m)]) , donc Pas sûr de ce que vous voulez dire. Il semble également que l'OP ne veut que la valeur, pas la structure, le lire sinon?


Vous pouvez ajouter goutte = false à la version multidex de [, mais pas à l'index unique.


@James, mais la sortie sera différente de ce que OP a demandé. J'ai envie de surcharger cela, bien que cela puisse être ajouté à la réponse si vous insistez. BTW, l'attribut Dim peut être ajouté ultérieurement si nécessaire.


@Davidarenburg - Benchmark indique clairement que je peux aller de l'avant et utiliser m [longueur (m)]. Merci beaucoup


@Samuelalexander qu'est-ce que vous allez faire avec toutes ces microsecondes que vous allez enregistrer par rapport à votre méthode?


@Roland Je veux juste trouver si la méthode que j'utilise est la bonne façon. Bien que la différence soit dans les microsecondes, je suis sûr que j'utilise la bonne méthode pour trouver le dernier élément.


@Samuelalexander Il n'y a pas de "droit" ici. Toutes les méthodes peuvent être utilisées et trois d'entre elles ont la même performance pour à peu près tous les objectifs.



2
votes

Je préférerais faire: xxx


4 commentaires

C'est aussi une bonne solution, mais vous devez expliquer que C supprime tous les attributs (y compris l'attribut DIM ) et contrainte ainsi la matrice dans un vecteur atomique. as.vector est généralement préférable pour cela (je me souviens d'une citation de B. Ripley à ce sujet).


intéressant, n'a pas encore expérimenté le licenciement des attributs entre C et as.vector


AS.Vector supprime également tous les attributs si le résultat est atomique. La raison de l'utilisation est que le code est plus clair.


@Roland Le problème principal avec cette méthode est que C crée une copie de la matrice entière que vous pouvez valider avec tracemem . Bien que l'avantage soit qu'il est plus flexible lorsque nous voulons choisir plus d'une valeur.



0
votes

Un moyen de le faire et d'éviter une répétition inutile du nom d'objet (ou des fautes de frappe idiotes) serait d'utiliser des tuyaux. Aime ceci:

require(magrittr)
M %>% .[nrow(.), ncol(.)]
##[1] 9
M %>% `[`(nrow(.), ncol(.))
##[1] 9
M %>% extract(nrow(.), ncol(.))
##[1] 9


0 commentaires