我有一个大小为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