这就是问题:
我有一个 indx{ii}
形式的元胞数组,其中每个 ii
都是一个大小为 1xNii
的数组(这意味着数组有不同的尺寸)。
另一个元胞数组采用 indy{jj}
形式,其中每个 jj
都是与 ii
大小相同的数组。
问题是我想创建一个函数来评估 indx{:}
数组中的值并取第一个不重复的值,如果是重复值则取下一个。
我会尝试用一个例子来解释。假设我们有 indx
和 indy
作为元胞数组:
indx{1} = [1 3 2 7];
indx{2} = [3 8 5];
indx{3} = [3 6 2 9];
indx{4} = [1 3 4];
indx{5} = [3 1 4];
indy{1} = [0.12 0.21 0.31 0.44];
indy{2} = [0.22 0.34 0.54];
indy{3} = [0.13 0.23 0.36 0.41];
indy{4} = [0.12 0.16 0.22];
indy{5} = [0.14 0.19 0.26];
我希望代码执行的操作是获取第一个值,并且在 indx
和 indy
中不重复。所以这个例子的答案应该是:
ans=
indx{1} = 1;
indx{2} = 3;
indx{3} = 6;
indx{4} = 4;
indx{5} = [];
indy{1} = 0.12;
indy{2} = 0.22;
indy{3} = 0.23;
indy{4} = 0.22;
indy{5} = [];
在 ans
中,对于 indx{1}
,代码采用 1
,因为它是第一个并且不会重复,并且采用中的等效值独立
。那么对于 indx{2}
,它需要 3
因为它是第一个值,并且之前没有在任何数组中重复作为第一个值。但对于 ind{3}
来说,它需要 6
,因为第一个值 3
会重复,并且会采用与 等效的值
为 indy
中的 60.23
。对于 ind{4}
,第一个和第二个值已作为第一个值重复,因此代码采用 4
及其在 indy
中的等效值。最后,对于 indx{5}
,由于所有值都已重复,因此代码不应采用任何值。
最佳答案
indx{1} = [1 3 2 7];
indx{2} = [3 8 5];
indx{3} = [3 6 2 9];
indx{4} = [1 3 4];
indx{5} = [3 1 4];
indy{1} = [0.12 0.21 0.31 0.44];
indy{2} = [0.22 0.34 0.54];
indy{3} = [0.13 0.23 0.36 0.41];
indy{4} = [0.12 0.16 0.22];
indy{5} = [0.14 0.19 0.26];
indx2 = NaN(numel(indx),1);
indx2(1) = indx{1}(1);
indy2 = NaN(numel(indy),1);
indy2(1) = indy{1}(1);
for ii = 2:numel(indx)
tmp1 = indx{ii}'; % get the original as array
tmp2 = indy{ii}';
if numel(tmp1)>numel(indx2)
tmp3 = [indx2;NaN(numel(tmp1)-numel(indx2),1)];
tmp4 = [indx2;NaN(numel(tmp1)-numel(indx2),1)];
else
tmp1 = [tmp1;NaN(numel(indx2)-numel(tmp1),1)];
tmp2 = [tmp2;NaN(numel(indx2)-numel(tmp2),1)];
tmp3 = indx2;
tmp4 = indy2;
end
tmp5 = ~ismember(tmp1,tmp3); % find first non equal one
tmp6 = find(tmp5,1,'first');
indx2(ii) = tmp1(tmp6); % save values
indy2(ii) = tmp2(tmp6);
end
N = numel(indx2);
indx2 = mat2cell(indx2, repmat(1,N,1));
N = numel(indy2);
indy2 = mat2cell(indy2, repmat(1,N,1));
indx2 =
[ 1]
[ 3]
[ 6]
[ 4]
[NaN]
我在这里所做的是首先初始化输出单元格,使其具有与原始数据相同数量的单元格。然后我分配值 1,因为该值始终是唯一的,因此它是第一个条目。之后,我使用 for 循环首先将所有四个元胞数组(2 个输入,2 个输出)转换为常规数组,以便使用 ismember
进行处理。 ,我在其中检查下一个输入单元格与输出中现有数字之间的所有不相等数字。然后find
用于获取第一个不匹配的数字。最后,将数字分配给数组(如果存在)。
作为对使用 NaN
bool 值的评论,请尝试 NaN ~=NaN
和 NaN ==NaN
。第一个将为您提供 1,而第二个将为您提供零。这种品质使得 NaN 成为此处填充的理想选择,因为 0 == 0
将导致 1:
A = [1,2,5,4,NaN];
B = [1,3,7,NaN,NaN];
ismember(A,B)
=
1 0 0 0 0
因此 NaN 彼此不相等,因此不会污染您的解决方案。
关于arrays - MATLAB - 避免元胞数组内向量中的重复值并取下一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32564763/