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番目の列は、vとして:Aの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

ダンが指摘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 に答える