Matlab 从矩阵M中,如何找到向量Vi的单元格,表示每列Ci中值2的索引行?

Matlab 从矩阵M中,如何找到向量Vi的单元格,表示每列Ci中值2的索引行?,matlab,matrix,Matlab,Matrix,从矩阵M中,如何找到向量Vi的单元格,表示每列Ci中值2的索引行 例如: M=[1 0 2 0; 0 2 2 1; 2 1 0 2; 2 1 2 0; 0 2 1 1] 预期输出:{[3 4],[2 5],[1 2 4],[3]}- 使用验证结果- 与- 使用验证结果- 您可以结合使用以下各项: 要再次检查: >> celldisp(out) out{1} = 3 4 out{2} = 2 5 out{3}

从矩阵M中,如何找到向量Vi的单元格,表示每列Ci中值2的索引行

例如:

M=[1 0 2 0;
   0 2 2 1;
   2 1 0 2;
   2 1 2 0;
   0 2 1 1]
预期输出:{[3 4],[2 5],[1 2 4],[3]}

-

使用验证结果-

与-

使用验证结果-


您可以结合使用以下各项:

要再次检查:

>> celldisp(out)

out{1} =

     3
     4

out{2} =

     2
     5

out{3} =

     1
     2
     4

out{4} =

     3
您可以使用找到编号2的列位置作为装箱参数,使用找到编号2的行位置将这些位置分组到同一个装箱中。accumarray的默认行为是对属于同一bin的值求和,而不是求和,我们将所有内容组合到一个数组中,因此输出将是一个单元格数组,其中每个索引都是所需的列位置,单元格内容告诉您哪些行包含对应列的数字2

如果列中没有值2,这也应该正确处理这种情况。此特定列的输出将为您提供空数组。例如,如果我们有:

>> M = [1 0 2 0; 0 2 2 1; 2 1 0 1; 2 1 2 0; 0 0 1 1]

M =

     1     0     2     0
     0     2     2     1
     2     1     0     1
     2     1     2     0
     0     0     1     1
在文章开头运行代码,我们得到:

>> celldisp(out)

out{1} =

     3
     4

out{2} =

     2

out{3} =

     1
     2
     4

out{4} =

     []

您可以结合使用以下各项:

要再次检查:

>> celldisp(out)

out{1} =

     3
     4

out{2} =

     2
     5

out{3} =

     1
     2
     4

out{4} =

     3
您可以使用找到编号2的列位置作为装箱参数,使用找到编号2的行位置将这些位置分组到同一个装箱中。accumarray的默认行为是对属于同一bin的值求和,而不是求和,我们将所有内容组合到一个数组中,因此输出将是一个单元格数组,其中每个索引都是所需的列位置,单元格内容告诉您哪些行包含对应列的数字2

如果列中没有值2,这也应该正确处理这种情况。此特定列的输出将为您提供空数组。例如,如果我们有:

>> M = [1 0 2 0; 0 2 2 1; 2 1 0 1; 2 1 2 0; 0 0 1 1]

M =

     1     0     2     0
     0     2     2     1
     2     1     0     1
     2     1     2     0
     0     0     1     1
在文章开头运行代码,我们得到:

>> celldisp(out)

out{1} =

     3
     4

out{2} =

     2

out{3} =

     1
     2
     4

out{4} =

     []
另一种方法:

M = [1 0 2 0; 0 2 2 1; 2 1 0 2; 2 1 2 0; 0 2 1 1]; %// data
v = 2; %// sought value
X = bsxfun(@times, (1:size(M,1)).', M==v); %'
y = nonzeros(X);
z = sum(X~=0, 1);
result = mat2cell(y.', 1, z);
对于不包含搜索值的列,这将返回[]。

还有另一种方法:

M = [1 0 2 0; 0 2 2 1; 2 1 0 2; 2 1 2 0; 0 2 1 1]; %// data
v = 2; %// sought value
X = bsxfun(@times, (1:size(M,1)).', M==v); %'
y = nonzeros(X);
z = sum(X~=0, 1);
result = mat2cell(y.', 1, z);


对于不包含搜索值的列,它将返回[]。

Nice。我喜欢我们用不同的方法得到相同的东西+1.这可以正确处理列,无任何2个大小写+很好。我喜欢我们用不同的方法得到相同的东西+1.这可以正确处理列,无任何2个大小写+1使用accumarray定制功能,实现卓越性能@LuisMendo-谢谢你,先生:也许你应该修改它,使它对不包含2的列返回[]。试一试例如M=[1020;0221;21101;21120;0011]@路易斯门多-那很容易。我将修改我的答案。@LuisMendo-修改。如果对你有效,请告诉我。对我来说是的。顺便说一句,谢谢你指出这个小缺陷。我假设每列至少有一个值等于2。accumarray与自定义函数的出色使用@LuisMendo-谢谢你,先生:也许你应该修改它,使它对不包含2的列返回[]。试一试例如M=[1020;0221;21101;21120;0011]@路易斯门多-那很容易。我将修改我的答案。@LuisMendo-修改。如果对你有效,请告诉我。对我来说是的。顺便说一句,谢谢你指出这个小缺陷。我假设每列至少有一个值等于2。看来这次bsxfun帽子已经切换到您了:@rayryeng我的第一个想法是Accumaray,但您已经选择了它!呵呵,哎呀。对不起的:。FWIW,我正要使用find和arrayfun,但@Divakar也从我这里选择了它@Divakar-我正式称这一天为MATLAB周一。@Divakar真有趣!!:-这一次,bsxfun帽子似乎已经换给了你:@rayryeng我的第一个想法是Accumaray,但你已经选择了它!呵呵,哎呀。对不起的:。FWIW,我正要使用find和arrayfun,但@Divakar也从我这里选择了它@Divakar-我正式称这一天为MATLAB周一。@Divakar真有趣!!:-我们的回答是否充分回答了你的问题?如果是这样,考虑接受我们的答案之一。好机会@我接受这三个答案!怎么做?谢谢你,你是接受方吗。唐克,我接受你的帮助。好机会@那么我会选择我收到的最快的回复!!圣马凯!好机会!我们的回答是否充分回答了你的问题?如果是这样,考虑接受我们的答案之一。好机会@我接受这三个答案!怎么做?谢谢你,你是接受方吗。唐克,我接受你的帮助。好机会@那么我会选择我收到的最快的回复!!圣马凯!好机会!