2013-09-16 4 views
7

Как удалить диагональные элементы (diagL) из моей матрицы L с помощью R? Я попытался с помощью следующих действий:Удаление диагональных элементов из матрицы в R

subset(L, select=-diag(L)) or 
subset(L, select=-c(diag(L))) 

, но я получаю 0 номера ...

+0

Какой язык вы используете? – lurker

+0

На каком языке? Что вы подразумеваете под удалением? Установлено в ноль? – us2012

+0

@ us2012 Я имею в виду удаление их из матрицы – Titi90

ответ

1

Имейте в виду, что диагональ будет иметь тот же X и Y индекс. Быстрая программа для обнуления диагонали C следующим образом:

#include <stdio.h> 
static void printMat(char mat[4][4], char *comment) 
{ 
    printf("%s:\n", comment); 
    for(int jj=0; jj<4; jj++) { 
     for(int ii=0; ii<4; ii++) { 
      printf("%2d ",mat[jj][ii]); 
     } 
     printf("\n"); 
    } 
} 
main() 
{ 
    static char matrix[4][4]= { 
     { 1, 2, 3, 4}, 
     { 5, 6, 7, 8}, 
     { 9,10,11,12}, 
     {13,14,15,16} 
    }; 


    printMat(matrix,"Before"); 
    for(int ii=0; ii<4; ii++) { 
     matrix[ii][ii]=0; 

    } 
    printMat(matrix,"After"); 
} 

Это приводит к:

Before: 
1 2 3 4 
5 6 7 8 
9 10 11 12 
13 14 15 16 
After: 
0 2 3 4 
5 0 7 8 
9 10 0 12 
13 14 15 0 

Чтобы удалить, а что просто очистить диагонали сложнее.

Это должно сделать трюк: (имейте в виду, что тетсру нулевых байтов может адресовать элементы, которые не существуют.)

#include <stdio.h> 
#include <strings.h> 
static void printMat(char *mat, int xDim, int yDim,char *comment) 
{ 
    printf("%s:\n", comment); 
    for(int jj=0; jj<yDim; jj++) { 
     for(int ii=0; ii<xDim; ii++) { 
      printf("%2d ",(mat[(jj)*xDim+ii])); 
     } 
     printf("\n"); 
    } 
} 
main() 
{ 
    static char matrix[4][4]= { 
     { 1, 2, 3, 4}, 
     { 5, 6, 7, 8}, 
     { 9,10,11,12}, 
     {13,14,15,16} 
    }; 
    static char new[4][3]; 

    printMat((char*)matrix,4,4,"Before"); 

    for(int ii=0; ii<4; ii++) { 
     memcpy(&new[ii][0], &matrix[ii][0],ii); 
     memcpy(&new[ii][ii],&matrix[ii][ii+1], 4-ii); 
    } 

    printMat((char*)new,3,4,"After"); 
} 

Результаты в:

Before: 
1 2 3 4 
5 6 7 8 
9 10 11 12 
13 14 15 16 
After: 
2 3 4 
5 7 8 
9 10 12 
13 14 15 

Конечно, если вы хотите что-то на другом языке, это помогает спросить.

+0

спасибо, но я хочу вычислить ее с помощью программирования R. – Titi90

11

Язык программирования R? Мне нравится C лучше, его легче произнести.

Один из способов заключается в создании матрицы с номерами, как я люблю их смотреть:

a<-t(matrix(1:16,nrow=4,ncol=4)) 

, который выглядит следующим образом:

 [,1] [,2] [,3] [,4] 
[1,] 1 2 3 4 
[2,] 5 6 7 8 
[3,] 9 10 11 12 
[4,] 13 14 15 16 

Удалить значения по диагонали:

diag(a)=NA 

, который приводит к:

 [,1] [,2] [,3] [,4] 
[1,] NA 2 3 4 
[2,] 5 NA 7 8 
[3,] 9 10 NA 12 
[4,] 13 14 15 NA 

Чтобы реально удалить значения, а не просто сделать их уйти, нам нужно переделать:

a<-t(matrix(which(!is.na(a)),nrow=3,ncol=4)) 

Какие результаты в:

 [,1] [,2] [,3] 
[1,] 2 3 4 
[2,] 5 7 8 
[3,] 9 10 12 
[4,] 13 14 15 

что то же самое, что мы получили в С выше.

Это немного круто, но это приводит к тому, что я вижу в качестве правильного ответа. Мне было бы интересно увидеть улучшенное решение кем-то, кто знает R лучше, чем я.

+0

Этот ответ фактически не работает, например, a <-t (матрица (11: 26, nrow = 4, ncol = 4)) – user1705135

6

Вот некоторые искусственные данные для иллюстрации:

x <- matrix(1:16, 4, 4) 
n <- nrow(x) 
x 
     [,1] [,2] [,3] [,4] 
[1,] 1 5 9 13 
[2,] 2 6 10 14 
[3,] 3 7 11 15 
[4,] 4 8 12 16 

После векторизации матрицы x, диагональные элементы соответствуют индексам 1, n+2, 2*n+3, ..., то есть в последовательности seq(1, n^2, n+1).Вы можете удалить эти показатели по

x[-seq(1,n^2,n+1)] 
[1] 2 3 4 5 7 8 9 10 12 13 14 15 

После «снятия диагонали» матрицы, вы можете сдвинуть нижнюю треугольную матрицу вверх, чтобы получить матрицу с n-1 строк и n колонок

matrix(x[-seq(1,n^2,n+1)], n-1, n) 
    [,1] [,2] [,3] [,4] 
[1,] 2 5 9 13 
[2,] 3 7 10 14 
[3,] 4 8 12 15 

или, возможно, это то, что вы хотите, вы можете сдвинуть нижнюю треугольную матрицу вправо, чтобы получить матрицу с строками n и n-1, переместив x, прежде чем удалять диагональные индексы и переносить их обратно.

t(matrix(t(x)[-seq(1,n^2,n+1)], n-1, n)) 
    [,1] [,2] [,3] 
[1,] 5 9 13 
[2,] 2 10 14 
[3,] 3 7 15 
[4,] 4 8 12 
Смежные вопросы