我有一个大小为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中有更简单和/或更快的方法吗?
答案 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