我在Matlab中有一个矩阵S,如下所示:
2 2 1 2
2 3 1 1
3 3 1 1
3 4 1 1
3 1 2 1
4 1 3 1
1 1 3 1我想按列计算价值观的模式。我感兴趣的是,在任何一列中,紧跟在数字3后面的数字的频率。例如,数字3在第一列中发生了三次。当我们第一次观察到它时,第二次是第三次,第二次是第三次,第三次是第四次。因此,在第一列中观察到的模式的频率如下:
3-3: 66.66%
3-4: 33.33%
3-1: 0%
3-2: 0%发布于 2015-02-10 12:40:11
要生成输出,可以使用方便的表形
S = [
2 2 1 2
2 3 1 1
3 3 1 1
3 4 1 1
3 1 2 1
4 1 3 1
1 1 3 1];
idx = find(S(1:end-1,:)==3);
S2 = S(2:end,:);
tabulate(S2(idx))
Value Count Percent
1 0 0.00%
2 0 0.00%
3 4 66.67%
4 2 33.33%发布于 2015-02-10 03:50:57
这里有一个方法,找到3,然后看下面的数字
[i,j]=find(S==3);
k=i+1<=size(S,1);
T=S(sub2ind(size(S),i(k)+1,j(k))) %// the elements of S that are just below a 3
R=arrayfun(@(x) sum(T==x)./sum(k),1:max(S(:))).' %// get the number of probability of each digit发布于 2015-02-10 03:54:27
我将以我能理解的方式重新陈述你的问题陈述,我的解决方案将反映这个新的问题陈述。
我们可以通过以下方式做到这一点:
A = [2 2 1 2
2 3 1 1
3 3 1 1
3 4 1 1
3 1 2 1
4 1 3 1
1 1 3 1]; %// Define your matrix
[row,col] = find(A(1:end-1,:) == 3);
vals = A(sub2ind(size(A), row+1, col));
h = 100*accumarray(vals, 1) / numel(vals)
h =
0
0
66.6667
33.3333让我们慢慢地看一下上面的代码。前几行定义示例矩阵A。接下来,我们将查看除矩阵的最后一行之外的所有行,并查看数字3在find中的位置。我们跳过最后一行,因为我们希望确保我们在矩阵的范围内。如果在最后一行有一个数字3,如果我们试图检查最后一行下面的值,就会有未定义的行为,因为那里什么都没有!
一旦我们这样做了,我们就会看到矩阵中那些在数字3下面的1行的值,我们使用sub2ind来帮助我们实现这一点。接下来,我们使用这些值并使用accumarray对它们进行汇总,然后用计算成百分比的总和对它们进行规范化。
结果将是一个4元素数组,该数组显示每个数字遇到的百分比。
为了进行二次检查,如果我们查看矩阵,我们可以看到3的值与其他3的值相同,共4次--第一列、第3行、第4行、第二列、第2行和第3列第6行。4的值跟随3次的值2次:第一列、第6行、第二列、第3行。
总之,我们有6个数字,所以除以6,我们得到4/6或66.67%的数字3和2/6或33.33%的数字4。
https://stackoverflow.com/questions/28423484
复制相似问题