MATLAB-在列中找到重复的值并从该行中提取值

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

我有一个矩阵,在第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