独立随机选择,在矩阵中每列替换元素

时间:2015-12-22 21:05:02

标签: matlab random vectorization

我有一个大小为A的矩阵r1 x c。我正在尝试创建一个大小为B的矩阵r2 x c,对于每个单独的列,我想随机抽样替换。

我写了这个代码来完成我正在寻找的东西:

%// Define a random index : 
RO = randi(r1,r2,c);

%// Define an output matrix
B = zeros(r2,c);

%// Perform selection        
for i1 = 1:c
    for i2 = 1:r2
        B(i2,i1) = A(RO(i2,i1),i1);
    end
end

在没有循环的MATLAB中有更简单和/或更快的方法吗?

1 个答案:

答案 0 :(得分:0)

如果我正确解释这段代码,你有一个矩阵,对于每一列,你认为这是一个单独的信号,你想从每个信号中随机抽取r2个元素来创建另一个{{1}可能有重复的信号。您希望水平堆叠这些列以生成输出矩阵。具有此矩阵的属性是对于每个列,此随机采样仅应用于输入矩阵中的相应列。

你当然可以做这个矢量化。矩阵r2将用作行坐标,列坐标(我们称之为RO)将只是枚举矩阵,其中每一行都是线性范围RC并且有{其中{1}}堆叠在一起。这可以通过repmat实现。

首先通过sub2ind获取行和列坐标的线性索引,然后使用它来索引输入矩阵1:c

r2

为了表明这是有效的,我创建了以下数据:

A

运行上面的代码给了我:

RO = randi(r1,r2,c);
RC = repmat(1:c,r2,1);
ind = sub2ind(size(A), RO, RC);
B = A(ind);

使用生成的相同矩阵rng(123); r1 = 5; r2 = 10; c = 3; A = randi(10, r1, c); ,我写的更优化的代码也给出了:

>> B

B =

     6    10     8
     7    10     5
     7    10     4
     3    10     4
     3     5     5
     6     5     1
     8     7     4
     6     7     8
     6     7     5
     6     7     4