MATLAB-在列中找到重复的值并从该行中提取值
我有一个矩阵,在第1列中有重复的值,例如:MATLAB-在列中找到重复的值并从该行中提取值,matlab,matrix,Matlab,Matrix,我有一个矩阵,在第1列中有重复的值,例如: A = [ 1 34 463; 2 45 684; 2 23 352; 3 31 256; 1 46 742; 4 25 234] B = [ 1 34 46; 2 45 23; 3 31 NaN; 4 25 NaN] 使用A,我希望从第二列中为第一列中的每个值提取数据,以输出B。如果第1列中的某个值出现重复,则第2列中的相应值将放入另一个输出列中(如果没有重复,则可以使用NAN)。例如: A = [ 1
A = [
1 34 463;
2 45 684;
2 23 352;
3 31 256;
1 46 742;
4 25 234]
B = [
1 34 46;
2 45 23;
3 31 NaN;
4 25 NaN]
使用A
,我希望从第二列中为第一列中的每个值提取数据,以输出B
。如果第1列中的某个值出现重复,则第2列中的相应值将放入另一个输出列中(如果没有重复,则可以使用NAN)。例如:
A = [
1 34 463;
2 45 684;
2 23 352;
3 31 256;
1 46 742;
4 25 234]
B = [
1 34 46;
2 45 23;
3 31 NaN;
4 25 NaN]
(不需要B
中的第1列,但此处包含该列以供澄清)
我尝试使用find函数、if
语句和循环的组合,但没有成功。理想情况下,一个成功的方法也是有效的,因为实际数据集很大
我使用R2012a版本。请提供建议。您可以用它来解决此类问题。当所有列或行的长度不相等时,使用单元格数组。每一行/列可以有不同的大小。它们不需要填充物来使它们大小相等
一种方法使用
您可以使用如下语法访问每个单元格outC{1}
>> outC{1}
ans =
46 34
如果您想同时查看整个矩阵,可以使用函数
如果希望将输出作为填充矩阵而不是单元数组,可以执行以下操作(在获得上述outC
后):
方法使用和
输出:
out =
46 34
23 45
31 NaN
25 NaN
如果使用替代方法(输出排序)查找outC
,结果将是:
out =
34 46
23 45
31 NaN
25 NaN
这将是一种方法-
[~,~,idx] = unique(A(:,1),'stable') %// Find IDs for each element from col-1
[~,sorted_idx] = sort(idx) %// Get sorted IDs
grp_vals = A(sorted_idx,2) %// Get second column elements grouped together
grp_lens = accumarray(idx,1)%// Find Group lengths
%// Create a mask for a 2D array where the ones are places where grouped
%// elements are to be put.
mask = bsxfun(@le,[1:max(grp_lens)]',grp_lens(:).')
%// Create a nan filled array of same shape as mask and finally fill masked
%// places with grouped elements. Transpose at the end to get desired output.
out = nan(size(mask))
out(mask) = grp_vals
out = out.'
样本运行-
>> A,out
A =
1 34 463
2 45 684
0 23 352
-3 31 256
1 46 742
4 25 234
1 12 99
-3 -20 56
out =
34 46 12
45 NaN NaN
23 NaN NaN
31 -20 NaN
25 NaN NaN
谢谢然而,当我在实际数据集上测试时,我得到以下错误:
使用accumarray时出错。第一个输入子项必须包含正整数下标。
除了大小之外,唯一的显著区别是实际的第一列以零开始-这可能是错误的来源吗?第一列中可能有零或负数,因此可以使用unique
获得唯一ID。@Divakar,当然会编辑。我猜你已经这么做了谢谢虽然它在本例中起作用,但当应用到我的数据集时,排序是一个问题。输出值与正确的行不对应。
>> A,out
A =
1 34 463
2 45 684
0 23 352
-3 31 256
1 46 742
4 25 234
1 12 99
-3 -20 56
out =
34 46 12
45 NaN NaN
23 NaN NaN
31 -20 NaN
25 NaN NaN