R эквивалентно Diag (X, K) в Matlab - PullRequest
2 голосов
/ 12 октября 2011

Полагаю, у меня есть двухуровневый вопрос, относящийся к diag в R и matlab.

1) Мне было интересно, был ли уже разработан способ доступа к различным диагоналям матриц в R, аналогичный тому, как это делается в Matlab (см. http://www.mathworks.com/help/techdoc/ref/diag.html).

2) Если текущей функции еще нет, как мой код можно улучшить так, чтобы он был похож на R diag, где

* * 1010

В настоящее время мой код возвращает элементы по диагонали с учетом k, но как это можно записать так, чтобы, если он был указан как второй способ (см. Выше), он позволял мне вставлять значения по диагонали. В настоящее время для этого я использую diag.ind, чтобы дать мне индексы, а затем использую эти индексы, чтобы вставить значения по диагонали k.

Вот код:

'diag.ind'<-function(x,k=0){
   if(k=='') k=0
   x<-as.matrix(x)

   if(dim(x)[2]==dim(x)[1]){
     stp_pt_r<-dim(x)[1]
     stp_pt_c<-dim(x)[2]
   }
   if(ncol(x)> dim(x)[1]){
     stp_pt_r<-dim(x)[1]
     stp_pt_c<-stp_pt_r + 1
   }
   if(ncol(x)< dim(x)[1]){
    stp_pt_c<-dim(x)[2]
    stp_pt_r<-stp_pt_c+1
   }

   if(k==0){
   r<-as.matrix(seq(1,stp_pt_r,by=1))
   c<-as.matrix(seq(1,stp_pt_c,by=1))
   ind.r<- cbind(r,c)
   }
  if(k>0){
    r<-t(as.matrix(seq(1,stp_pt_r,by=1)))
    c<-t(as.matrix(seq((1+k),stp_pt_c,by=1)))
   ind<-t(rbind.fill.matrix(r,c))
   ind.r<-ind[!is.na(ind[,2]),]
  }
  if(k<0){
    k<-abs(k)
    r<-t(as.matrix(seq((1+k),stp_pt_r,by=1)))
    c<-t(as.matrix(seq(1,stp_pt_c,by=1)))
    ind<-t(rbind.fill.matrix(r,c))
    ind.r<-ind[!is.na(ind[,1]),]
  }
diag.x<-x[ind.r]

output<-list(diag.x=diag.x, diag.ind=ind.r)
return(output)
}

Это немного неуклюже, и я чувствую, что, должно быть, заново изобретаю колесо. Заранее благодарим за понимание!

Ответы [ 2 ]

3 голосов
/ 12 октября 2011

После вашего ответа Андри это может удовлетворить:

 exdiag <- function(mat, off) {mat[row(mat)+off == col(mat)]}
 x <- matrix(1:16, ncol=4)
 exdiag(x,1)
#[1]  5 10 15

Я подумал, что вам нужна функция, которая может присваивать или возвращать одну из диагональной или суб- или супердиагональной матрицы.Функция конструктора:

subdiag <- function(vec, size, offset=0){ 
      M <- matrix(0, size, size)
      M[row(M)-offset == col(M)] <- vec
      return(M)}
> subdiag(1, 5, 1)
     [,1] [,2] [,3] [,4] [,5]
[1,]    0    0    0    0    0
[2,]    1    0    0    0    0
[3,]    0    1    0    0    0
[4,]    0    0    1    0    0
[5,]    0    0    0    1    0

При вызове только двух аргументов вы получите диагональную матрицу.Вы можете построить супердиагональные матрицы с отрицательными смещениями.Если это то, что вы хотели для конструктора, то не должно быть слишком сложно создать аналогичную функцию subdiag<-, чтобы согласиться с ней.

0 голосов
/ 12 октября 2011

В MATLAB, чтобы присвоить значения x диагонали A:

n = size(A,1);
A(1:n+1:end) = x

Посмотрите линейное индексирование.

Хотя, это может быть не то, что вы просили.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...