请考虑我的示例代码:
N=256; % some constant
data=randsrc(1,N,[1:.01:5]); % data points
b=[1,2,4,8,16] % no. of blocks where a b represents no. of rows in output matrix
如何使用data
循环在这样的数据索引的随机分组中将b=[1,2,4,8,16]
(1x256)划分为块for
:
对于单个输出矩阵,以下是条件:
每行随机选取数据点,不包括其他行选取的数据点。
连续的其余索引都为零。
输出矩阵如下:
out1= 1xN=same as data(1x256)(no division into blocks)
out2= is a 2xN matrix
row 1 picks random 128 data points and rest of indices are zero.
row 2 picks rest of the 128 data points (excluding data points of row 1)
and places them at a different index (other than that of row 1).
类似地,
out4= is a 4xN matrix
Each row uniquely picks random 64 data points
out8= is 8xN matrix
and Each row picks 32 random data points
out16= is a 16xN matrix
and Each row picks 16 random data points.
如何使用在for
上运行的b=[1,2,4,8,16]
循环来完成此操作?
答案 0 :(得分:1)
由于每个输出矩阵的行数不同,因此最简单的方法是将它们放在与b
长度相同的单元格数组中。
out = cell(numel(b),1);
以下循环将计算b
中每个值的矩阵(例如[1 2 4 8 16]
)。
for ii=1:numel(b),
out{ii} = zeros(b(ii),N);
partInds = floor((randperm(N)-1)*(b(ii)/N));
out{ii}(sub2ind([b(ii) N],partInds+1,1:N)) = data;
end
对于问题中的值b=[1 2 4 8 16]
和N=256
,out
将如下所示:
out =
[ 1x256 double]
[ 2x256 double]
[ 4x256 double]
[ 8x256 double]
[16x256 double]
请注意,您可以使用out{ii}
验证矩阵sum(out{ii}>0,2)
的每一行中预期的非零数。
答案 1 :(得分:0)
o=zeros(b,numel(data))
r=mod(randperm(256),b)
o(sub2ind([b,N],r,[1:N]))=data
基本上我生成了一个向量r
,它包含写入数据的行。第二行的其余部分是转换为线性指数。
/ updated,现在每个大小包含相同数量的零。