[R] Undocumented behaviour of diag when replacing the diagonal of a matrix?

Spencer Graves @pencer@gr@ve@ @end|ng |rom e||ect|vede|en@e@org
Thu Dec 5 14:23:38 CET 2024


Hi, Gerrit:


On 12/5/24 05:04, Gerrit Eichner wrote:
> Hi, Bert,
> 
> thx, but I don't think so, because your example fails, if you use
> different entries for matrix A than your vector 1:25. (Try A filled with 
> only zeroes, e.g.)


YOU'VE MISUNDERSTOOD Bert's reply: A matrix is a vector, and Bert 
assigned the indices of the vector to the cells of the matrix.


 > A <- matrix(1:25, nrow = 5, ncol = 5)
 > A[1:25]
  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 
23 24 25
 > A[13]
[1] 13


	  "if you use different entries for matrix A", the entries are no 
longer the indices of A as a vector.


	  Does this fact make his example work for you?


	  It does for me.
	  Hope this helps.
	  Spencer Graves

> 
> I guess, Duncan Murdochs hint is crucial. I'll comment on his asap.
> 
>   Best regards  --  Gerrit
> 
> ---------------------------------------------------------------------
> Dr. Gerrit Eichner                   Mathematical Institute, Room 215
> gerrit.eichner using math.uni-giessen.de   Justus-Liebig-University Giessen
> Tel: +49-(0)641-99-32104          Arndtstr. 2, 35392 Giessen, Germany
> https://www.uni-giessen.de/math/eichner
> ---------------------------------------------------------------------
> 
> Am 04.12.2024 um 14:38 schrieb Bert Gunter:
>> matrices are vectors with a "dim" attribute.
>> So what I think is happening is:
>>
>>> A <- matrix(1:25, nrow = 5, ncol = 5)
>>> diag(A[-1,]) <- 0
>>> A
>>       [,1] [,2] [,3] [,4] [,5]
>> [1,]    1    6   11   16   21
>> [2,]    0    7   12   17   22
>> [3,]    3    0   13   18   23
>> [4,]    4    9    0   19   24
>> [5,]    5   10   15    0   25
>>>
>>> ## is equivqalent to:
>>>
>>> A <- matrix(1:25, nrow = 5, ncol = 5)
>>> wh <- c(diag(A[-1,]))   # A's vector indices of diag(A[-1,])
>>> A[wh] <- 0
>>> A
>>       [,1] [,2] [,3] [,4] [,5]
>> [1,]    1    6   11   16   21
>> [2,]    0    7   12   17   22
>> [3,]    3    0   13   18   23
>> [4,]    4    9    0   19   24
>> [5,]    5   10   15    0   25
>>
>> I didn't check, but I assume your other examples would work similarly.
>> Please repost if I am wrong.
>>
>> Cheers,
>> Bert
>>
>> On Wed, Dec 4, 2024 at 4:39 AM Gerrit Eichner
>> <gerrit.eichner using math.uni-giessen.de> wrote:
>>>
>>> Dear list,
>>>
>>> is anyone aware of the following behavious of diag when used to replace
>>> diagonals (plural!) of a matrix?
>>>
>>> Small example: The following is documented and clearly to be expected:
>>>
>>> A <- matrix(0, nrow = 5, ncol = 5)
>>> diag(A) <- 1; A
>>>
>>>
>>> BUT, what about the following? When executing the code of `diag<-` line
>>> by line, it throws errors. So why does it work?
>>>
>>> diag(A[-1, ]) <- 2; A
>>>
>>> diag(A[-5, -1]) <- 3; A
>>>
>>> diag(A[-5, -(1:2)]) <- 4; A
>>>
>>>
>>> Any ideas?
>>>
>>>    TIA and best regards  --  Gerrit
>>>
>>> ---------------------------------------------------------------------
>>> Dr. Gerrit Eichner                   Mathematical Institute, Room 215
>>> gerrit.eichner using math.uni-giessen.de   Justus-Liebig-University Giessen
>>> Tel: +49-(0)641-99-32104          Arndtstr. 2, 35392 Giessen, Germany
>>> https://www.uni-giessen.de/math/eichner
>>>
>>> ______________________________________________
>>> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
>>> https://stat.ethz.ch/mailman/listinfo/r-help
>>> PLEASE do read the posting guide https://www.R-project.org/posting- 
>>> guide.html
>>> and provide commented, minimal, self-contained, reproducible code.
> 
> ______________________________________________
> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide https://www.R-project.org/posting- 
> guide.html
> and provide commented, minimal, self-contained, reproducible code.



More information about the R-help mailing list