algorithm - 如何生成具有单位长度列的随机 n*y 矩阵?

标签 algorithm random matrix

是否有生成随机矩阵的特定形式或算法,其中所有列的范数都等于 1?

我将在 c/obj-c 中实现该算法。然而,只是关于如何去做的一般想法适合我!

最佳答案

我做到了。

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

  • 数字生成,不是来自均匀分布的伪随机数;
  • 规范化没有做好;除法应按向量长度而不是向量中的元素数进行。

这是正确的代码。顺便说一句,我使用了 this 库中的一段代码,它实现了 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;
}

关于algorithm - 如何生成具有单位长度列的随机 n*y 矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16614074/

相关文章:

algorithm - 在非循环有向图中查找两个节点之间所有路径的有效方法

algorithm - 将人们分成最满意的团队

algorithm - 检测时间轴上的冲突,第 2 部分 : Isolate "True" Overlaps

R:在 X-Y 网格中查找缺失的组合

python - 查找包含集合中所有值的最短连续子数组的算法

random - 如何在 Elixir 中生成随机数?

java - Java 中的随机类型对象总是给我相同的数字

c - 生成随机线性无关二元 vector 的问题

matrix - 有效地将向量解包为二进制矩阵 Octave

用向量替换三角形矩阵的一部分