我环顾四周,找到了近距离的解决方案,但很难将它们提炼到我想要的地方。
给定矩阵 A
A = [12 1 0 ...;
22 1 0 ...;
1 2 1 ...;
12 1 2 ...;
2 3 2 ...;
21 1 1 ...;]
我需要在A(:,1)
和A(:,2)==1
时收集A(:,3)=={0,1,2,...}
中的所有元素。
换句话说,我对A
的解决方案如下:
12 1 12
22 21 2
到目前为止我的代码是:
B = A( A(:,2) == 1 & A(:,3) == 0, 1 )
C = A( A(:,2) == 1 & A(:,3) == 1, 1 )
D = A( A(:,2) == 1 & A(:,3) == 2, 1 )
有没有办法在不创建的情况下将 B
, C
和 D
连接在一起首先是3个矩阵,这样(应用伪代码):
B( 0,(1:3) ) = A( A(:,2) == 1 & A(:,3) == (0:3), 1 )
的吗
由于
答案 0 :(得分:0)
如果我理解正确,您可以使用ismember
,如下所示:
filter = A(:,2)==1 & ismember(A(:,3),0:3);
B = A(filter,1);
您不需要单独的filter
变量来执行此操作,我只是为了清晰起见而倾向于这样做。
答案 1 :(得分:0)
您可以使用accumarray
作为第四个参数{/ 3}}:
ind = A(:,2)==1;
result = accumarray(1+A(ind,3), A(ind,1), [], @(x) {x});
这会生成一个单元格数组,每个单元格中都有一个值向量。在您的示例中,
result{1} =
22
12
result{2} =
21
result{3} =
12