就是这样:
C = cellfun(@(x, y){sparse(1,find(ismember(x,y),numel(y)),true,1,size(A,2))}, ...
mat2cell(A, ones(size(A, 1), 1), size(A, 2)), B(:));
C = A(:, all(~vertcat(C{:})));
有cellfun
两个元胞数组:第一个包含 的行,A
第二个是B
。匿名函数是棘手的部分。它对一对对应的两个行进行操作,如下所示:
- 它
ismember
用于检查 中的哪些列A
包含 中的任何元素B
。
- 它用于
find
仅选择第N
一个,相对于B
.
- 它
sparse
用作将其余元素归零的一种奇特方式。
对于您的示例,它看起来像这样:
A = [1 5 10 23; 2 4 2 18; 3 3 5 14; 1 9 10 4];
B = {1; [2 4]; [3 3 14]; 1};
C = cellfun(@(x, y){sparse(1,find(ismember(x,y),numel(y)),true,1,size(A,2))}, ...
mat2cell(A, ones(size(A, 1), 1), size(A, 2)), B(:));
产生:
C =
{
[1 0 0 0]
[1 1 0 0]
[1 1 0 1]
[1 0 0 0]
}
之后,选择结果列是一个简单的逻辑索引问题:
C = A(:, all(~vertcat(C{:})));
在这种情况下应该是:
C =
10
2
5
10