Thanks Bill,
This one will work perfectly, the others required an existing matrix  
to be modified, which isn't the case (I'm using this xyz function in a  
larger construct). Plus it's only a 12x12, so not too big on memory.
Thank you!
Stu


On 11 • Mar • 2009, at 6:34 PM, <Bill.Venables@csiro.au> wrote:

>
> This is horrible on memory if you are dealing with large matrices.
>
> Here is a slightly more slick version of the function I have already  
> posted:
>
>
> xyz <- function (v, k) {
>    n <- length(v) + abs(k)
>    x <- matrix(0, n, n)
>    i <- (1 - min(0, k)):(n - max(0,k))
>    j <- (1 + max(0, k)):(n + min(0,k))
>    x[cbind(i,j)] <- v
>    x
> }
>
> The point of this is that it does not hold three copies of the  
> matrix in memory at once (x, row(x) and col(x)).  It uses the matrix  
> index idea instead.
>
> If you were going to be doing this a lot, you would be better  
> writing a function `Diag<-`, say, which places a vector at a  
> specified diagonal position of a given matrix.  This is an easy  
> exercise for the reader!
>
>
> Bill Venables
> http://www.cmis.csiro.au/bill.venables/
>
>
> -----Original Message-----
> From: r-help-bounces@r-project.org [mailto:r-help-bounces@r-project.org 
> ] On Behalf Of Sundar Dorai-Raj
> Sent: Thursday, 12 March 2009 10:00 AM
> To: Stu Field
> Cc: r-help@r-project.org
> Subject: Re: [R] Matrix Construction; Subdiagonal
>
> You can always write your own function:
>
> myDiag <- function(x, vec, k) {
>  x[row(x) == col(x) - k] <- vec
>  x
> }
>
> myDiag(A, vec, -1)
>
> Of course, you should probably do some input checking too.
>
> --sundar
>
> On Wed, Mar 11, 2009 at 4:57 PM, Stu Field <sgf@colostate.edu> wrote:
>> Sure, that'll work fine, thanks.
>> But I guess I was looking for something more similar to MatLab, I'm  
>> really
>> surprised R doesn't have a preset command for this (?)
>> Thanks again,
>> Stu
>> On 11 . Mar . 2009, at 5:49 PM, Sundar Dorai-Raj wrote:
>>
>> Does this help?
>>
>> A <- matrix(0, 6, 6)
>> vec <- 1:5
>> A[row(A) == col(A) + 1] <- vec
>>
>> --sundar
>>
>> On Wed, Mar 11, 2009 at 4:42 PM, Stu Field <sgf@colostate.edu> wrote:
>>
>> I'm trying to enter a vector into the subdiagonal of a matrix but
>>
>> cannot find a command in R which corresponds to the MatLab version of
>>
>> diag(vec, k), where vec = the vector of interest, and k = the  
>> diagonal
>>
>> (k=0 for the diagonal; k=-1 for the subdiagonal; k=1 for
>>
>> superdiagonal, etc.)
>>
>> Is there an equivalent command in R?
>>
>> I'm looking for something like this:
>>
>> vec = seq(1, 5, 1)        # vector of interest
>>
>> A = xyz(vec,-1)           # creates a 6x6 matrix with vec on the
>>
>> subdiagonal
>>
>> where xyz is some function similar to diag, but with differing
>>
>> arguments.
>>
>> I can't believe there is not a simple way to do this...
>>
>> Thanks for your help,
>>
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>
>> Stu Field, PhD
>>
>> Postdoctoral Fellow
>>
>> Department of Biology
>>
>> Colorado State University
>>
>> 1878 Campus Delivery
>>
>> Fort Collins, CO 80523-1878
>>
>> Office: E208 Anatomy/Zoology
>>
>> Phone: (970) 491-5744
>>
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>
>>
>>
>>
>>
>>        [[alternative HTML version deleted]]
>>
>> ______________________________________________
>>
>> R-help@r-project.org mailing list
>>
>> https://stat.ethz.ch/mailman/listinfo/r-help
>>
>> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
>>
>> and provide commented, minimal, self-contained, reproducible code.
>>
>>
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> Stu Field, PhD
>> Postdoctoral Fellow
>> Department of Biology
>> Colorado State University
>> 1878 Campus Delivery
>> Fort Collins, CO 80523-1878
>> Office: E208 Anatomy/Zoology
>> Phone: (970) 491-5744
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>
>>
>>
>>
>
> ______________________________________________
> R-help@r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Stu Field, PhD
Postdoctoral Fellow
Department of Biology
Colorado State University
1878 Campus Delivery
Fort Collins, CO 80523-1878
Office: E208 Anatomy/Zoology
Phone: (970) 491-5744
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~





	[[alternative HTML version deleted]]


