library(dplyr)
df1 %>%
group_by(b) %>%
summarise_at(vars(starts_with("alpha")), sum)
是一个数组。如果B
,我的预期输出为:B = [1 2 1]
等,我的功能如下:
[0 0 0], [1 0 0], [1 1 0], [1 1 1], [0 1 1]
但是,function [output] = AllCombination(B)
output = [];
for i = 0:B(1)
for j = 0:B(2)
for k = 0:B(3)
output = [output; [i,j,k]];
end
end
end
可以是任意长度。我该怎么做才能使其适应任何长度的B
?
答案 0 :(得分:2)
function [output] = AllCombination(B)
C = arrayfun(@(x)0:x, B, 'UniformOutput', false);
D = cell(1,numel(B));
[D{:}]=ndgrid(C{:});
output = cell2mat(cellfun(@(x)x(:), D, 'UniformOutput', false));
第一行构造一个单元格数组,其范围从0到B
的每个元素。第二个创建一个正确大小的空单元格数组,用于存储第三行的输出,它将步骤1中的范围传递给ndgrid
。这构造了范围的所有组合。最后,我们应用cellfun
将每个转换为列向量,并将它们与cell2mat
连接起来。
答案 1 :(得分:0)
另一种解决方案:
L = prod(B+1); % length of the resulting array
output = zeros(L,length(B)); % preallocating memory
for ii = 1:length(B) % for each column of the output array
output(:,ii) = imresize(repmat(0:B(ii),1,prod(B(1:(ii-1))+1)), [1 L], 'nearest')';
end
说明:
repmat(0:B(ii),1,prod(B(1:(ii-1))+1)
重复序列0:B(ii)
的次数与之前B的所有元素的乘积一样多。考虑到计数从零开始,我们将+1
添加到所有元素。
imresize(...,[1 L], 'nearest')';
将矢量缩放到数组的长度
编辑:
使用interp1
代替imresize
的版本,以防您没有图像处理工具箱:
L = prod(B+1); % length of the resulting array
output = zeros(L,length(B)); % preallocating memory
for ii = 1:length(B) % for each column of the output array
p = prod(B(1:(ii-1))+1);
output(:,ii) = interp1(1:(((B(ii)+1)*p)), repmat(0:B(ii),1,p), linspace(1, (((B(ii)+1)*p)), L), 'nearest');
end