4

次のタスクで問題が発生しています。3x6マトリックスを想定します。

A =

0.2787    0.2948    0.4635    0.8388    0.0627    0.0435
0.6917    0.1185    0.3660    0.1867    0.2383    0.7577
0.6179    0.7425    0.0448    0.4009    0.9377    0.4821

私がやりたいのは、次のように行列をブロックに分割することです。

A =

0.2787    0.2948  |  0.4635    0.8388  |  0.0627    0.0435
0.6917    0.1185  |  0.3660    0.1867  |  0.2383    0.7577
0.6179    0.7425  |  0.0448    0.4009  |  0.9377    0.4821

これらのブロックを垂直方向に連結して、最終結果を取得します。

0.2787    0.2948 
0.6917    0.1185  
0.6179    0.7425  
0.4635    0.8388
0.3660    0.1867
0.0448    0.4009
0.0627    0.0435
0.2383    0.7577
0.9377    0.4821

これで助けが得られれば、おそらく任意の行列Aに対してそれを行うことができると思います。forループを使用して上記の問題を解決できますが、ベクトル化された解決策を探しています。

前もって感謝します!N。

4

5 に答える 5

3

次の点を考慮してください。

A = rand(3,6);
blkSz = 2;

C = mat2cell(A, size(A,1), blkSz*ones(1,size(A,2)/blkSz));
C = cat(1,C{:})

size(A,2)これは、が で割り切れると仮定します。blkSz

于 2012-06-05T21:03:54.377 に答える
3

これは、マトリックスがAあり、必要なものがある場所で機能しますD

C = mat2cell(A,[3],[2 2 2])
D = cat(1,C{:})
于 2012-06-05T21:15:47.223 に答える
1

これはどう:

width = 2; 
m = length(A(:))/width;
fn = @(i) reshape(A(:, i:width:end), m, 1);
B = cell2mat(arrayfun(fn, 1:width, 'UniformOutput', false));

width変数で一度に必要な列の数を指定するだけです。

于 2012-06-05T21:06:34.643 に答える
0

垂直方向に連結することにより、3 で割り切れる行列幅は次のようになります。

B = [ A(:,1:(size(A,2)/3)); A(:,size(A,2)/3+1:size(A,2)/3*2); A(:,size(A,2)/3*2+1:end) ];
于 2012-06-05T21:20:04.097 に答える