如何编码'所有组合'在MATLAB?

时间:2017-06-26 04:11:51

标签: arrays matlab matrix

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

2 个答案:

答案 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