我有一个矩阵A = (4*4)和一个单元格数组B {4,1}。我想在 A 中找到 B 的所有值,逐行搜索,然后我想删除与此特定值关联的相应列。我在使用 bsxfun o cellfun 时遇到问题,并找到带有矩阵和单元格数组的函数。我试图将单元格数组转换为矩阵,但我没有更多确切的对应关系。
例如: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 =
10
2
5
10
提前感谢,L.
方法如下:
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