如何跨稀疏矩阵行随机分布数据点

时间:2013-11-28 04:15:09

标签: arrays matlab matrix cell-array

请考虑我的示例代码:

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

对于单个输出矩阵,以下是条件:

  1. 每行随机选取数据点,不包括其他行选取的数据点。

  2. 连续的其余索引都为零。

  3. 输出矩阵如下:

    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]循环来完成此操作?

2 个答案:

答案 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=256out将如下所示:

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,现在每个大小包含相同数量的零。