1

すべての列ノルムが1に等しいランダム行列を生成する特定の形式またはアルゴリズムはありますか?

c/obj-c でアルゴリズムの実装を行います。しかし、それを行う方法の一般的なアイデアだけが私に合っています!

4

1 に答える 1

0

私はそれを作りました。

その答えでは、2つのことが間違っています:

  • 一様分布からの疑似乱数ではない数の生成。
  • 正規化が正しく行われていません。除算は、ベクトルの要素数ではなく、ベクトルの長さで行う必要があります。

これは正しいコードです。ところで、このライブラリのスニペット コードを使用して、ジグラットアルゴリズムを実装しています。

 + (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;
}
于 2013-05-19T17:31:32.493 に答える