具有不同列数的 vec2mat

vec2mat w/ different number of columns

参考 Reshape row wise w/ different starting/ending elements number @Divakar 提出了一个很好的解决方案但是,如果列数不总是相同怎么办?

示例 运行 -

>> A'
ans =
     4     9     8     9     6     1     8     9     7     7     7     4     6     2     7     1
>> out
out =
     4     9     8     9     0     0
     6     1     8     9     7     7
     7     4     6     2     7     1

我只取了A的前4项,把它们放出来,然后用0填充剩下的2个空单元格。所以ncols = [4 6 6]。不幸的是 vet2mat 不允许向量作为列号。

有什么建议吗?

您可以在这里使用 bsxfun 的屏蔽功能 -

%// Random inputs
A = randi(9,1,15)
ncols = [4 6 5]

%// Initialize output arary of transposed size as compared to the desired 
%// output arary size, as we need to insert values into it row-wise and MATLAB 
%// follows column-major indexing
out = zeros(max(ncols),numel(ncols)); 

mask =  bsxfun(@le,[1:max(ncols)]',ncols); %//'# valid positions mask for output
out(mask) = A; %// insert input array elements
out = out.' %//'# transpose output back to the desired output array size

代码运行-

A =
     5     3     7     2     7     2     4     6     8     1     9     7     5     4     5
ncols =
     4     6     5
out =
     5     3     7     2     0     0
     7     2     4     6     8     1
     9     7     5     4     5     0

你可以使用 accumarray

A = [4 9 8 9 6 1 8 9 7 7 7 4 6 2 7 1].'; %'// data
ncols = [4 6 6]; %// columns
n = max(ncols);
cs = cumsum(ncols);
ind = 1;
ind(cs+1) = 1;
ind = cumsum(ind(1:end-1)); %// `ind` tells the row for each element of A
result = accumarray(ind(:), A(:), [], @(x) {[x; zeros(n-numel(x),1)]}); %// split `A` as 
    %// dictated by `ind`, and fill with zeros. Each group is put into a cell.
result = [result{:}].'; %'// concatenate all cells