4

如果第一列值相同,这个问题是MatLab(或任何其他语言)转换矩阵或 csv 以将第二列值放入同一行的产物?

如果

      A = [2 3 234 ; 2 44 33; 2 12 22; 3 123 99; 3 1232 45; 5 224 57]

第一栏 | 第二栏 | 第三栏

2             3          234
2             44         33
2             12         22
3             123        99
3             1232       45
5             224        57

然后运行

    [U ix iu] = unique(A(:,1) ); 
    r= accumarray( iu, A(:,2:3), [], @(x) {x'} )

会告诉我错误

    Error using accumarray
    Second input VAL must be a vector with one element for each row in SUBS, or a
    scalar.

我要实现

第一栏 | 第二栏 | 第三栏 | 第四栏 | 第五栏 | 第六列| 第七栏

2         3        234       44        33        12        22
3         123      99        1232      45
5         224      57

我知道如何使用 for 和 if 来做到这一点,但这在大数据上花费了太多时间。

我怎样才能做到这一点?

先感谢您!

4

1 回答 1

2

accumarray在为上一个问题提供的解决方案中滥用了。第一个参数iu是索引向量,第二个参数应该是相同长度的值向量。您在这里所做的是指定一个矩阵作为第二个参数,实际上它的值比iu.

为了使其工作,您需要做的是为第二列和第三列创建一个索引向量(它们是相同的索引,并非巧合!)并指定一个匹配的列向量,如下所示:

[U, ix, iu] = unique(A(:,1));
vals = reshape(A(:, 2:end).', [], 1);                    %'// Columnize values
subs = reshape(iu(:, ones(size(A, 2) - 1, 1)).', [], 1); %'// Replicate indices
r = accumarray(subs, vals, [], @(x){x'});

此解决方案适用于您要传递到的任意数量的列accumarray

于 2013-07-03T13:04:17.257 回答