4

例如,我希望用值 0.25,0.25,0.25,0.25,0,0,0 .....(11 列为零)填充一个 15 列矩阵,以便填充所有可能的列组合。在这个例子中,我使用 4 列 0.25 和其他 11 列 0。

结果应如下所示:-

0.25  0.25  0.25  0.25  0.00  0.00  0.00  0.00 .......
0.25  0.25  0.25  0.00  0.25  0.00  0.00  0.00 .......
0.25  0.25  0.25  0.00  0.00  0.25  0.00  0.00 .......

 .     .     .     .     .     .     .     .   .......
 .     .     .     .     .     .     .     .   .......
0.25  0.25  0.00  0.25  0.25  0.00  0.00  0.00 .......
0.25  0.25  0.00  0.25  0.00  0.25  0.00  0.00 ....... etc, etc.  

当使用“perms”(无论如何限制为 10 个元素)时,它会将每个“0”视为它们是唯一的,因此我得到多个相同的行。如果少于 10 个元素,“唯一”功能可以正常工作,但我需要使用更多。感谢任何帮助,谢谢

4

2 回答 2

4

在这种情况下,函数accumarray是你的朋友。我将做一个更简单的示例 - 创建一个六列矩阵,其中恰好填充了两列,其余列为零。

首先,我们获取您想要填充的水平索引列表nchoosek

x = nchoosek(1:6, 2);

现在获取垂直坐标

y = repmat((1:size(x,1))', 1, 2);

最后,用于accumarray创建所需的矩阵

z = accummarray([y(:), x(:)], 0.5);

结果是

>> z
z =
    0.5000    0.5000         0         0         0         0
    0.5000         0    0.5000         0         0         0
    0.5000         0         0    0.5000         0         0
    0.5000         0         0         0    0.5000         0
    0.5000         0         0         0         0    0.5000
         0    0.5000    0.5000         0         0         0
         0    0.5000         0    0.5000         0         0
         0    0.5000         0         0    0.5000         0
         0    0.5000         0         0         0    0.5000
         0         0    0.5000    0.5000         0         0
         0         0    0.5000         0    0.5000         0
         0         0    0.5000         0         0    0.5000
         0         0         0    0.5000    0.5000         0
         0         0         0    0.5000         0    0.5000
         0         0         0         0    0.5000    0.5000

把它打包成一个函数,你得到

function z = combinations(N, K)

    x = nchoosek(N, K);
    y = repmat((1:size(x,1))', 1, K);
    z = accumarray([y(:), x(:)], 1);

end
于 2013-10-07T06:52:25.113 回答
1

您可以使用文件交换中的combn

例如:

c      = combn([0 0.25],15);  
ind    = find(sum(c')==1);
Result = c(ind,:)

这里的策略可能有点矫枉过正,但它是如此简单易行,我心想,为什么不呢?

首先,得到一个长度为 15 的向量的所有可能组合00.25其中有 2^15 个),如第一行所做的那样,我们得到一个 [2^15 x 15] 矩阵 ( c)。然后我们发现c总和为 1 的行,这意味着值 0.25 恰好出现了四次。然后,重新使用它c,瞧!

如果你想获得c自己(没有combn),这是如何做到的:

V = [0 0.25];
a = [0:2^15-1]+(1/2) ;
b = [2.^(1-15:0)] ;
id = rem( floor((a(:) * b(:)')) , 2 ) + 1 ;
c = V(id) ; 
于 2013-10-07T06:10:14.240 回答