2013-05-01 121 views
0

我有一个矩阵,我想选择t随机列从一个新的矩阵在八度随机,但我希望我的随机选择加权的比例基于奇异值分解的矩阵。所以基本上我想选择t随机列,其概率是在选择之前确定的。有没有办法在Octave/Matlab中做到这一点?在Octave中抽样随机列

谢谢!

+0

请参阅http://stackoverflow.com/questions/2977497/weighted-random-numbers-in-matlab – carandraug 2013-05-01 22:27:13

回答

0

假设你有重量,W,(或者你的情况可能是一些矩阵的特征值的函数)的一些行向量,你应该先创建一个表示权重的标准化累积总和向量如下:

cumNormW = cumsum(W)./sum(W); 

cumNormW的值现在应该是单调增加的,应该从W(1)1

下一步,你要采取从均匀分布在绘制[0,1]

randVal = rand(1); 

您将使用这个随机值来查找你刚才随机选择相应的列。最后,您想要找到累积归一化权重向量的第一个索引。

randCol = find(cumNormW <= randVal, 1, 'last') 

这为您提供最终的随机列选择。

现在如果你想确保你选择t不同列,你需要不断的randCol先前值的轨道,只是再次重申上述上面randValrandCol步骤,直到产生一个尚未未选中列。


比方说,你有4列的矩阵,你已经计算出该矩阵的特征值和存储他们W.我们假设列对应的特征向量,你想选择与特征值成比例的列与特征值之和进行比较。

W = [4 3 2 1]; 

正火后,你会得到cumNormW = [0.40 0.70 0.90 1];

正如你所看到的,你有画一个​​数字,导致比上选择第一列(`randVal < = 0.4' )的显著概率较高列('0.9 < randVal < = 1')

您可以通过rand(1)绘制一个随机数,对于此示例,可以说randVal = 0.82。使用最后的randCol步骤,对于此迭代,您将获得randCol = 3