2012-04-25 21 views
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

矩陣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) 

如何做,沒有一個循環是有沒有辦法?

+0

我不知道我理解這個問題,但考慮Matlab的功能,cellfun(http://www.mathworks.com/help/techdoc/ref/cellfun.html) – Dan 2012-04-25 06:15:51

+0

標題說:「選擇條目並放入一個沒有循環的**單元格**中,但我假設你想要把條目放在一個**矩陣**中,正如你在你的問題中解釋的那樣。 「A」應該是**矩陣**,而不是**單元**? – nrz 2012-04-25 07:49:20

回答

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循環快了很多的解決方案。 編輯:更正了代碼中的錯字。通過使用cellfun

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

慢了很多解決方案(cellfun做循環):

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 
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呼叫已被設置爲返回一個數值數組containikng在單元陣列中的每個數字陣列的第一個元素。匿名函數@(x)x(1)作爲核心,只是返回第一個元素,並且cellfun負責實現適當的循環而不打擾您的細節。

請注意,cellfun通常不會比它替換的循環更快。它只需要更少的打字,並且在學會使用它之後可以更容易閱讀。

+0

感謝@Pursuit的解釋 – pac 2012-04-28 07:00:33