假设我有一个单元格
A = {[3,0], [2,1]}
和一个单元格数组
B = {[4,-1],[3,0];
[-1,4],[-3,5];
[3,0],[2,1];
[2,1],[-1,4]}.
我想找到A
中的第一个或第二个条目都显示在B
中的索引,不包括B
中A
的两个条目出现的行。
在这个示例中,我应该为[1 4]
中的行获取B
之类的内容。我一直在尝试使用cellfun
和cell2mat
解决这个问题,但仍然磕磕绊绊。
答案 0 :(得分:0)
C=zeros(size(B));
for i=1:size(C,1);
for j=1:size(C,2);
for k=1:length(A);
C(i,j)=C(i,j)+isequal(B{i,j},A{k}); % Does element k of A match?
end;
end;
end;
find(sum(C')==1) % Sums the rows and finds the rows with only one match
答案 1 :(得分:0)
我会通过将我的单元格数组转换为适当尺寸的数字数组来解决此问题,然后使用ismember
。
以下示例说明了此方法如何对问题中的示例单元格数组起作用:
%# Build the example cell arrays
A = {[3,0], [2,1]};
B = {[4,-1],[3,0];
[-1,4],[-3,5];
[3,0],[2,1];
[3,0],[3,0];
[2,1],[-1,4]};
%# Get the number of elements in A, and the length of the first element
K = size(A, 2);
J = length(A{1, 1});
%# Convert cell arrays to usefully shaped numerical matrices
ANumVec = cell2mat(A);
ANum = reshape(ANumVec, K, J)';
BNum = cell2mat(B);
%# Find matches of 1*2 vectors in ANum in sets of two columns of BNum
I1 = ismember(BNum(:, 1:J), ANum, 'rows');
I2 = ismember(BNum(:, J+1:end), ANum, 'rows');
I3 = ismember(BNum, ANumVec, 'rows');
%# Find all indices where there was exactly 1 match (ie omit cases of no matches and cases of 2 matches)
MainIndex = I1 + I2;
MainIndex(I3) = 0;
Soln = find(MainIndex > 0);
有些观点:
1)此方法查找B
中所有行的索引,其中A
的元素位于B
的第一列或第二列,不包括 A
与B
行完全对应的情况。
2)如果A
中有多行,此方法将失败。然而,A
是大小为1 * N的单元阵列是稳健的,其中N表示一些任意数量的1 * 2数值向量。因此,可以通过首先将A
重新整形为1 * N单元阵列来规避单行限制。
3)使用逻辑运算符==
测试等效性。除非您有理由相信您的输入不会出现任何浮点错误,否则浮点数可能会很危险。