【问题标题】:How to generate a random n*y matrix with columns of unit length?如何生成具有单位长度列的随机 n*y 矩阵?
【发布时间】:2013-05-17 16:41:42
【问题描述】:

是否有任何特定形式或算法可以生成所有列范数都等于 1 的随机矩阵?

我将在 c/obj-c 中实现该算法。然而,如何做到这一点的一般想法会适合我!

【问题讨论】:

  • 您可以在随机生成值后对列进行规范化。
  • @mbeckish,所以,有一种方法可以对每一列进行标准化,使其范数等于 1?如何做到这一点?
  • Have a look at this question。总之,如果您通过从标准高斯分布中绘制每个坐标来生成随机单位向量,然后进行归一化(将其除以其长度),您将获得方向的均匀分布。只需对每一列执行此操作即可。
  • 请参阅此答案的第一部分。 stackoverflow.com/a/10178470/56778
  • 将列中的每个值除以列的向量长度。

标签: algorithm random matrix


【解决方案1】:

我做到了。

在那个答案中有两点是错误的:

  • 数字生成,不是来自均匀分布的伪随机数;
  • 规范化未正确完成;应该按向量长度而不是向量中元素的数量进行划分。

这是正确的代码。顺便说一句,我使用了来自 this 库的 sn-p 代码,它实现了 Ziggurat 算法。

 + (NSMutableArray *) generateNormalPseudoRandomNumbers:(NSInteger)n {

  NSMutableArray *randomNumberArray = [[NSMutableArray alloc] initWithCapacity:n];

  unsigned long int seed;

  for (NSInteger j = 0; j < 3; j++ )
  {
    if ( ( j % 2 ) == 0 )
    {
      seed = 123456789;
    }
    else
    {
      seed = 987654321;
    }

    for (NSInteger i = 1; i <= 10; i++ )
    {
      float value = [Utils r4_uni:&seed];
      [randomNumberArray addObject:[NSNumber numberWithFloat:value]];
    }
  }

  return randomNumberArray;
}

 + (double) computeVectorNorm:(NSMutableArray *) matrix {
  NSInteger x = [matrix count];
  double norm = 0;

  for(NSInteger i=0; i<x;i++){
      norm += pow([[matrix objectAtIndex:i] doubleValue], 2.0f);
  }
  norm = sqrt(norm);

  return norm;
}
 + (NSMutableArray *) normalizeRandomNumberArray:(NSMutableArray *) randomNumberArray {
  double norm = [self computeVectorNorm:randomNumberArray];

  for(NSInteger i=0; i< [randomNumberArray count]; i++) {
    NSNumber *normalizedNumber = [NSNumber numberWithDouble:([[randomNumberArray objectAtIndex:i] doubleValue] / norm)];
    [randomNumberArray replaceObjectAtIndex:i withObject:normalizedNumber];
  }

  return randomNumberArray;
}

+ (double *) generateAMatrix:(NSInteger)k d:(NSInteger)d {

  double *matrix = (double *) malloc(k * d * sizeof(double)); 
  for(NSInteger i=0; i < k; i++) {
    NSMutableArray *column = [self normalizeRandomNumberArray:[self generateNormalPseudoRandomNumbers:d]];
    for(NSInteger j=0; j<d; j++) {
      matrix[i*d+j] = [[column objectAtIndex:j] doubleValue];
    }
  }

  return matrix;
}

【讨论】:

    猜你喜欢
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 2012-11-21
    • 2018-08-11
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多