选择条目并放入一个没有循环的矩阵

时间:2012-04-25 06:07:04

标签: matlab matrix cell-array

我有以下内容:

   b = [1x4 double]    [1x4 double]    [1x4 double]    [1x4 double]    [1x4 double]    [1x4 double]    [1x4 double]    [1x4 double]    [1x4 double]    [1x4 double]

其尺寸可变。

b{1}

ans =

 0     0     0     0

我想将10个向量中每个向量的第一个条目作为矩阵A的第一列

矩阵A的第二列将作为r的10个向量中的每一个的第一个条目:

r = 

[1x4 double]    [1x4 double]    [1x4 double]    [1x4 double]    [1x4 double]    [1x4 double]    [1x4 double]    [1x4 double]    [1x4 double]    [1x4 double]
  
    

r {1} - > ans = 10 10 10 10

  

这是我需要得到的:

A = 

    v{1}(1)   r{1}(1)
    v{2}(1)   r{2}(1)
    v{3}(1)   r{3}(1)

如果没有循环,如何做到这一点?

2 个答案:

答案 0 :(得分:1)

一些示例数据:

b = {[ 101:104 ], [ 201:204 ], [ 301:304 ], [ 401:404 ], [ 501:504 ], [ 601:604 ], [ 701:704 ], [ 801:804 ], [ 901:904 ], [ 1001:1004 ]};

r = {[ 2101:2104 ], [ 2201:2204 ], [ 2301:2304 ], [ 2401:2404 ], [ 2501:2504 ], [ 2601:2604 ], [ 2701:2704 ], [ 2801:2804 ], [ 2901:2904 ], [ 3001:3004 ]};

编辑:使用vertcat无需循环的更快的解决方案。 编辑:更正了代码中的拼写错误。

bMatrix = vertcat(b{:});
rMatrix = vertcat(r{:});
A = [ bMatrix(:,1), rMatrix(:,1) ];

使用cellfuncellfun循环)的速度慢得多的解决方案:

A = [ cellfun(@(x) x(1), b)', cellfun(@(x) x(1), r)' ];

或部分:

ColumnOneOfMatrixA = cellfun(@(x) x(1), b)';
ColumnTwoOfMatrixA = cellfun(@(x) x(1), r)';
A = [ ColumnOneOfMatrixA, ColumnTwoOfMatrixA ];

两种方式都会产生相同的结果。

A =
     101        2101
     201        2201
     301        2301
     401        2401
     501        2501
     601        2601
     701        2701
     801        2801
     901        2901
    1001        3001

答案 1 :(得分:0)

正如Dan所说,cellfun是避免这种循环的伎俩。

%Setup test data
for ix = 1:10
    b{ix} = ones(1,4)*(ix-1);
    r{ix} = ones(1,4)*(ix+9);
end

%Cellfun based definition of the "A" matrix
A = [...
    cellfun(  @(x)x(1),  b(1:10)  ); ...
    cellfun(  @(x)x(1),  r(1:10)  ); ...
    ]';

此处cellfun调用已设置为返回一个数字数组,包含单元格数组中每个数字数组的第一个元素。匿名函数@(x)x(1)作为核心,只返回第一个元素,cellfun负责实现适当的循环,而不会打扰您的细节。

请注意,cellfun通常不会比它替换的循环快。它只需要较少的打字,并且在您学习使用它之后可以更容易阅读。