需要考虑 MATLAB 中二元选择的可能组合
need to consider possible combinations for a binary choice in MATLAB
我想构建一个 2^n*n 矩阵来评估 n 个代理的二元决策的所有可能决策向量。
因此,N 个人在 {0,1} 之间进行选择,他们的选择形成一个决策向量,例如 [1,1,0,1,0.....]。我想要一个由所有可能的决策向量组成的矩阵。
我尝试使用 repmat
复制 {0,1} n 次,然后 allcomb
,但这没有用。 (也许我做错了。)
我还在某处读到我可以使用 A = (dec2bin(0:(2^n)-1));
事实上,我确实得到了一些类似于我想要的东西,但是,我程序的其余部分(用于我的实际分析部分研究)给出了垃圾结果。
我在 matlab 中编写了一个代码,为 5 个人执行此操作(和模式),但我只嵌套了 5 个循环。我想扩展这个。任何帮助表示赞赏。
当前密码是
A= zeros (2^n,n); %creates blank strategy space
x=0; % x is an iteration counting term and should be = 2^n if code runs correctly
for i=0:1
for j=0:1
for k=0:1
for l=0:1
for m=0:1
x=x+1;
v1=i;
v2=j;
v3=k;
v4=l;
v5=m;
A(x,:)=[v1 v2 v3 v4 v5]; % at termination this loop should generate an exhaustive list of all possible strategy profiles
end
end
end
end
end
x;
我昨天才开始使用 MATLAB,所以我觉得这很糟糕......
如果我正确地解释了你的问题,给定 n
位,你想将所有可能的十进制值枚举成从 0 到 2^n-1
的二进制等效值。这可以通过调用 dec2bin
并转换为数值数组来完成:
n = 5;
A = dec2bin(0:2^n-1, n) - '0';
我提供了一个从 0 到 2^n-1
的向量,步长为 1,并允许 dec2bin
将这些十进制值中的每一个转换为具有 n
数字的二进制形式。
与 '0'
的减法很重要,因为 dec2bin
最初生成一个字符数组,其中每一行都是二进制数字序列,但实际上是字符。如果要将字符数组转换为数字,请记住字符以 ASCII 表示,因此用数字 0 的 ASCII 代码减去将得到 0 和 1 的实际值。
使用 n=5
,我们得到这个(这与您的代码生成的相同):
A =
0 0 0 0 0
0 0 0 0 1
0 0 0 1 0
0 0 0 1 1
0 0 1 0 0
0 0 1 0 1
0 0 1 1 0
0 0 1 1 1
0 1 0 0 0
0 1 0 0 1
0 1 0 1 0
0 1 0 1 1
0 1 1 0 0
0 1 1 0 1
0 1 1 1 0
0 1 1 1 1
1 0 0 0 0
1 0 0 0 1
1 0 0 1 0
1 0 0 1 1
1 0 1 0 0
1 0 1 0 1
1 0 1 1 0
1 0 1 1 1
1 1 0 0 0
1 1 0 0 1
1 1 0 1 0
1 1 0 1 1
1 1 1 0 0
1 1 1 0 1
1 1 1 1 0
1 1 1 1 1
我想构建一个 2^n*n 矩阵来评估 n 个代理的二元决策的所有可能决策向量。
因此,N 个人在 {0,1} 之间进行选择,他们的选择形成一个决策向量,例如 [1,1,0,1,0.....]。我想要一个由所有可能的决策向量组成的矩阵。
我尝试使用 repmat
复制 {0,1} n 次,然后 allcomb
,但这没有用。 (也许我做错了。)
我还在某处读到我可以使用 A = (dec2bin(0:(2^n)-1));
事实上,我确实得到了一些类似于我想要的东西,但是,我程序的其余部分(用于我的实际分析部分研究)给出了垃圾结果。
我在 matlab 中编写了一个代码,为 5 个人执行此操作(和模式),但我只嵌套了 5 个循环。我想扩展这个。任何帮助表示赞赏。
当前密码是
A= zeros (2^n,n); %creates blank strategy space
x=0; % x is an iteration counting term and should be = 2^n if code runs correctly
for i=0:1
for j=0:1
for k=0:1
for l=0:1
for m=0:1
x=x+1;
v1=i;
v2=j;
v3=k;
v4=l;
v5=m;
A(x,:)=[v1 v2 v3 v4 v5]; % at termination this loop should generate an exhaustive list of all possible strategy profiles
end
end
end
end
end
x;
我昨天才开始使用 MATLAB,所以我觉得这很糟糕......
如果我正确地解释了你的问题,给定 n
位,你想将所有可能的十进制值枚举成从 0 到 2^n-1
的二进制等效值。这可以通过调用 dec2bin
并转换为数值数组来完成:
n = 5;
A = dec2bin(0:2^n-1, n) - '0';
我提供了一个从 0 到 2^n-1
的向量,步长为 1,并允许 dec2bin
将这些十进制值中的每一个转换为具有 n
数字的二进制形式。
与 '0'
的减法很重要,因为 dec2bin
最初生成一个字符数组,其中每一行都是二进制数字序列,但实际上是字符。如果要将字符数组转换为数字,请记住字符以 ASCII 表示,因此用数字 0 的 ASCII 代码减去将得到 0 和 1 的实际值。
使用 n=5
,我们得到这个(这与您的代码生成的相同):
A =
0 0 0 0 0
0 0 0 0 1
0 0 0 1 0
0 0 0 1 1
0 0 1 0 0
0 0 1 0 1
0 0 1 1 0
0 0 1 1 1
0 1 0 0 0
0 1 0 0 1
0 1 0 1 0
0 1 0 1 1
0 1 1 0 0
0 1 1 0 1
0 1 1 1 0
0 1 1 1 1
1 0 0 0 0
1 0 0 0 1
1 0 0 1 0
1 0 0 1 1
1 0 1 0 0
1 0 1 0 1
1 0 1 1 0
1 0 1 1 1
1 1 0 0 0
1 1 0 0 1
1 1 0 1 0
1 1 0 1 1
1 1 1 0 0
1 1 1 0 1
1 1 1 1 0
1 1 1 1 1