Matlab 如何使用FOR循环将数据数组划分成这样的块?

Matlab 如何使用FOR循环将数据数组划分成这样的块?,matlab,Matlab,如何使用for循环将数据数组划分为这样的块 请考虑我的示例代码: a = -1-j; b = 2-j; % some constants data = a+(b-a)*rand(1,256); % data b=[1,2,4,8,16] % number of blocks 如何将我的数据划分为块b=[1,2,4,8,16]在一组相邻的数据索引中,例如,使用for循环运行b: out1=1x256=same as data(1x256)(no division into blocks) o

如何使用
for
循环将数据数组划分为这样的块

请考虑我的示例代码:

a = -1-j;  b = 2-j; % some constants
data = a+(b-a)*rand(1,256); % data
b=[1,2,4,8,16] % number of blocks
如何将我的数据划分为块
b=[1,2,4,8,16]
在一组相邻的数据索引中,例如,使用
for
循环运行
b

out1=1x256=same as data(1x256)(no division into blocks)

out2=[data(1:128) zeros(1,128);zeros(1,128) data(129:256)]; % 2x256

out4=[ data(1:64) zeros(1,192);               % 4x256
       zeros(1,64) data(65:128) zeros(1,128); 
       zeros(1,128) data(129:192) zeros(1,64);
       zeros(1,192) data(193:256)];

out8= [ data(1:32) zeros(1,224);              % 8x256
        zeros(1,32) data(33:64) zeros(1,192);
        zeros(1,64) data(65:96) zeros(1,160);
        zeros(1,96) data(97:128) zeros(1,128)
        zeros(1,128) data(129:160) zeros(1,96);
        zeros(1,160) data(161:192) zeros(1,64);
        zeros(1,192) data(193:224) zeros(1,32);
        zeros(1,224) data(225:256)];
同样地

out16=[data(1:16) zeros(17,240);             % 16x256
       zeros(1,16) data(17:32) zeros(1,224);
       ...
       ...                                ]

首先,它需要一个矩阵,指出数据所属的位置:

z=size(data,2);
s=bsxfun(@(x,y)(floor(x)==y),[1:b/z:(b+1-b/z)],[1:b]');
现在我们可以用这个矩阵来填写

out=zeros(b,z);
out(s)=data;

完整代码:

a = -1-j;  b = 2-j; z=256; % some constants
data = a+(b-a)*rand(1,z); % data
out={};
for b=[1,2,4,8,16]
    s=bsxfun(@(x,y)(floor(x)==y),[1:b/z:(b+1-b/z)],[1:b]');
    out{end+1}=zeros(b,z);
    out{end}(s)=data;
end
不需要循环。用于处理需要使用数据写入的条目:

n = 4; %// n arbitrary, but should divide k
k = length(data);
outn = zeros(n,k); %// initialize
cols = 1:k; %// column indices: 1 2 3 ... k
rows = floor(0:n/k:n-n/k)+1; %// row indices: 1 1 ... 1 2 2 ... 2 3 ...
outn(rows+n*(cols-1)) = data; %// write data into those rows and cols

使用
{:}
单元格数组索引语法中的逗号分隔列表,可以直接使用生成输出矩阵。只需使用
mat2cell
分割
数据
。在循环中使用
b的每个值:

N = numel(data);  % ensure data is a row vector
out={};
for b =  [1 2 4 8 16],
    dataCell = mat2cell(data,1,(N/b)*ones(1,b));
    out{end+1} = blkdiag(dataCell{:});
end

+1对于自包含代码:谢谢,但我的要求是使用“b”的for循环一次完成这一切。