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



我有一个大小为r1 x c的矩阵A。我试图创建一个大小为r2 x c的矩阵B,其中对于每个单独的列,我想随机采样并替换。

我写了这个代码,做我正在寻找的:

%// 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中有没有一种更简单和/或更快的方法可以在没有循环的情况下做到这一点?

如果我正确地解释了这段代码,那么您有一个矩阵,对于每一列,您认为这是一个单独的信号,并且您希望从每个信号中随机采样r2元素,以创建另一个可能有重复的r2信号。您希望将这些列水平堆叠以生成输出矩阵。该矩阵的一个特性是,对于每一列,该随机采样仅应用于输入矩阵中的相应列。

你当然可以把它矢量化。矩阵RO将被用作行坐标,而列坐标,我们将称之为RC,将简单地是枚举的矩阵,其中每一行是线性范围1:c,并且其中有r2堆叠在彼此之上。这可以通过repmat来实现。

首先通过sub2ind获得行和列坐标的线性索引,然后使用该索引对输入矩阵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

使用生成的相同矩阵RO,我编写的更优化的代码也给出了:

>> 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

最新更新