簡體   English   中英

Rcpp - 如何計算rowSums正好為1的矩陣

[英]Rcpp - How to compute a matrix where rowSums is exactly 1

我試圖創建一個隨機數矩陣,其中rowSums應該是1。

我已經有一個條件來檢查rowSums是否不是1並嘗試糾正它。

當我打印出結果時,它看起來是正確的,但如果我測試所有值是否為1,它會給我一些FALSE值。

我怎么能糾正這個?

library(Rcpp)

cppFunction('
NumericMatrix imembrandc(int n, int k) {
  NumericMatrix u( n , k );
  IntegerVector sequ = seq(1,100);
  NumericVector sampled;
  for (int i=0; i < k; ++i) {
    sampled = sample(sequ, n);
    u(_,i) = sampled / sum(sampled);
  }

  if (is_true(any(rowSums(u) != 1))) {
    u(_,1) = u(_,1) + (1 - rowSums(u));
  }

  return(u);
}')

當我打印出結果的rowSums時,它看起來是正確的:

res = imembrandc(n = 10, k = 5)
rowSums(res)

[1] 1 1 1 1 1 1 1 1 1 1

但檢查它會產生一些錯誤:

rowSums(res) == 1

[1] TRUE TRUE TRUE TRUE FUE FALSE TRUE FUE FUE FALSE TRUE

生成總和為1的n隨機數的規范方法是從[0,1)生成n - 1值,將0和1加到列表中並獲取排序列表的差異。 當然,這取決於隨機數所需的分布。 這可以用R表示

set.seed(42)
v <- diff(sort(c(0, runif(5), 1)))
v
#> [1] 0.28613953 0.35560598 0.18870211 0.08435842 0.02226937 0.06292459
sum(v)
#> [1] 1

reprex包創建於2019-05-24(v0.2.1)

在你的C ++案例中:

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
NumericMatrix imembrandc(int n, int k) {
  NumericMatrix u(n, k);
  for (int i = 0; i < n; ++i) {
    NumericVector row = runif(k - 1);
    row.push_back(0.0);
    row.push_back(1.0);
    u(i, _) = diff(row.sort());
  }
  return u;
}

/*** R
set.seed(42)
res = imembrandc(n = 10, k = 5)
rowSums(res)
rowSums(res) == 1
all.equal(rowSums(res),rep(1, nrow(res)))
*/

請注意,我正在生成行,而您正在生成列,然后嘗試更正rowSum 輸出:

> set.seed(42)

> res = imembrandc(n = 10, k = 5)

> rowSums(res)
 [1] 1 1 1 1 1 1 1 1 1 1

> rowSums(res) == 1
 [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

> all.equal(rowSums(res),rep(1, nrow(res)))
[1] TRUE

BTW, all.equal也為你的矩陣提供TRUE ,因為差異非常小。 但我發現從一開始就避免這個問題會更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM