0

所以例如我有

第一栏 | 第二栏

1             1
1             3
1             9
2             4
2             7

我想把它转换成

第一栏 | 第二栏 | 第三栏 | 第四栏

1             1           3           9
2             4           7           3

(3,4) 元素应该为空。

我可以通过 Matlab 使用 for 和 if 来做到这一点,但是对于大量数据来说需要太多时间,所以我需要一个更优雅、更聪明的想法。

我更喜欢 Matlab,但其他语言也可以。(如果该语言可以解决我的问题,我可以将矩阵导出为 csv 或 xlsx 或 txt 并使用其他语言。)

先感谢您!

[更新]

如果

      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

我怎样才能做到这一点?先感谢您!

4

1 回答 1

2

accumarray与自定义函数一起使用

>> r = accumarray( A(:,1), A(:,2), [], @(x) {x'} ); %//'
 r = 
  [1x3 double]
  [1x2 double]
>> r{1}
 ans =
  1     3     9
>> r{2}
 ans =
  4     7

更新:
将单元格转换r为矩阵B(在评论中提供进一步的请求):

>> [U ix iu] = unique( A(:,1) ); % see EitantT's comment
>> r = accumarray( iu, A(:,2), [], @(x) {x'} ); 
>> n = cellfun( @numel, r ); % fund num elements in each row - need for max
>> mx = max(n);
>> pad = 555555; % padding value
>> r = cellfun( @(x) [x pad*ones(1,mx - numel(x))], r, 'uni', 0 );
>> B = vertcat( r{:} ); % construct B from padded rows of r
于 2013-07-01T13:01:56.733 回答