Как вручную определить, является ли матрица симметричной c? - PullRequest
1 голос
/ 20 апреля 2020

Я пытался проверить, симметрична ли матрица c, но это не работает.

> View(new.function)
> View(new.function)
> new.function <- function(a){
+     for(i in 1:nrow(a)){
+         for(j in 1:ncol(a)){
+             if(a==t(a)){
+                 print("true")
+             }else{print("false")}
+         }
+     }
+ }
> a <- matrix(1:3,3,3)
> a
     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    2    2    2
[3,]    3    3    3
> new.function(a)
[1] "true"
[1] "true"
[1] "true"
[1] "true"
[1] "true"
[1] "true"
[1] "true"
[1] "true"
[1] "true"

1 Ответ

2 голосов
/ 21 апреля 2020

В базе есть функция (как уже упоминалось в комментариях), которая может дать вам то, что вам нужно.

isSymmetric.matrix(a)
 # [1] FALSE

Однако, если вы хотите написать свою собственную функцию, то вы должны знать, что вам не нужны петли. Вы можете проверить, являются ли матрица и ее транспонирование одинаковыми (все записи равны), просто используя all.

new.function <- function(a) {all(a==t(a))}

или all.equal (менее эффективно).

new.function <- function(a) {all.equal(b, t(b))==1}

Если вы настаиваете на использовании циклов, то вы должны использовать индексы в своем сравнении. Здесь я изменил способ сравнения записей. Я предполагаю, что матрица симметрична; если один из индексов и соответствующая ему запись из транспонированной матрицы (a[i,j] будет сравниваться с t(a)[i,j] или a[j,i]) были неравны, то я выхожу из циклов и возвращаю FALSE.

new.function <- function(a){
                ans = TRUE
                for(i in 1:nrow(a)){
                        for(j in 1:ncol(a)){
                                if(a[i,j]!=a[j,i]){
                                        ans = FALSE;break}
                        }}
                return(ans)}

Но это совсем не эффективно.

...