0

我有以下内容:

   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

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

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)

如何在没有循环的情况下做到这一点有没有办法?

4

2 回答 2

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) ];

使用cellfun( cellfundos loop) 的解决方案要慢得多:

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
于 2012-04-25T07:17:14.750 回答
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它通常不会比它替换的循环快。它只需要更少的打字,并且在你学会使用它之后可以说更容易阅读。

于 2012-04-25T07:15:51.763 回答