मेरे पास एक मैट्रिक्स जनरेटिंग फ़ंक्शन है जो 1 के निचले-त्रिकोण और 0s के ऊपरी-त्रिकोण का उत्पादन करता है।

मैं सोच रहा था कि क्या कुछ समायोज्य यादृच्छिक शोर (कुछ वितरण से जो यादृच्छिक 0 और 1 देता है) को आउटपुट मैट्रिक्स में जोड़ना संभव हो सकता है जैसे कि यादृच्छिक 0 यादृच्छिक रूप से कुछ को प्रतिस्थापित करता है नीचे 1s, और यादृच्छिक 1s बेतरतीब ढंग से कुछ शीर्ष 0s को प्रतिस्थापित करते हैं?

lower_mat <- function(r, c) {
  m <- matrix(0, nrow=r,ncol=c)
  m[lower.tri(m)] <- 1
  m
}


lower_mat(5,4)
#      [,1] [,2] [,3] [,4]
# [1,]    0    0    0    0
# [2,]    1    0    0    0
# [3,]    1    1    0    0
# [4,]    1    1    1    0
# [5,]    1    1    1    1
1
rnorouzian 26 सितंबर 2020, 06:37

1 उत्तर

सबसे बढ़िया उत्तर

यदि आप यह मान लेना चाहते हैं कि आप एक निश्चित संख्या में पदों के निचले से ऊपरी हिस्से में अदला-बदली कर रहे हैं, तो आप कर सकते हैं

swap_upper_lower <- function(m, n) {
  tops <- which(upper.tri(m))
  bots <- which(lower.tri(m))
  stopifnot(length(bots)>=n && length(tops)>=n)
  tops <- sample(tops, n)
  bots <- sample(tops, n)
  vals <- m[tops]
  m[tops] <- m[bots]
  m[bots] <- vals
  m
}

mm <- lower_mat(5,4)
swap_upper_lower(mm, 3)

यह 3 मानों को निचले त्रिभुज से ऊपरी त्रिभुज में स्वैप करेगा

यदि आप इसे 0 और 1 के पदों की अदला-बदली के रूप में सोचना पसंद करते हैं, तो आप इसके बजाय ऐसा कर सकते हैं

swap_0_1 <- function(m, n) {
  ones <- which(m==1)
  zers <- which(m==0)
  stopifnot(length(ones)>=n && length(zers)>=n)
  ones <- sample(ones, n)
  zers <- sample(zers, n)
  vals <- m[ones]
  m[ones] <- m[zers]
  m[zers] <- vals
  m
}

ध्यान दें कि यह अन्य फ़ंक्शन की तुलना में विकर्ण पर मानों को अलग तरीके से व्यवहार करेगा।

1
MrFlick 26 सितंबर 2020, 03:43