3

配列 A があり、各列の最後の 4 つの要素を 2x2 行列に再形成したいと考えています。結果をセル配列 B に格納したいと思います。

たとえば、次のようになります。

A = [1:6; 3:8; 5:10]';

次のように、B に 3 つの 2x2 配列を含めたいと思います。

B{1} = [3, 5; 4, 6];
B{2} = [5, 7; 6, 8];
B{3} = [7, 9; 8, 10];

のようなものを使用して for ループでこれを行うことができ、 をreshape(A(end-3:end, ii), 2, 2)ループしiiます。誰かがベクトル化された方法を提案できますか?おそらくそれに似たものを使用してcellfun、配列の列に繰り返し操作を適用できますか?

4

1 に答える 1

2

私がこれを行う方法は、目的のインデックスを調べてから、通常は何らかの形式のrepmatを使用してそれらを生成する方法を見つけることです。たとえば、各列の最後の4つの項目が必要な場合、Aへの(絶対)インデックスは3,4,5,6になり、それに行数を追加して次の列に移動し、9を取得します。 、10、11、12など。したがって、問題は、行数、列数、および各列から必要な要素数の観点からその行列を生成することです(私はそれをnと呼びます。あなたの場合はn = 4です)。

octave:1>  A = [1:6; 3:8; 5:10]'
A =

    1    3    5
    2    4    6
    3    5    7
    4    6    8
    5    7    9
    6    8   10

octave:2>  dim=size(A)
dim =

   6   3

octave:3> n=4
n =  4
octave:4> x=repmat((dim(1)-n+1):dim(1),[dim(2),1])'
x =

   3   3   3
   4   4   4
   5   5   5
   6   6   6

octave:5> y=repmat((0:(dim(2)-1)),[n,1])
y =

   0   1   2
   0   1   2
   0   1   2
   0   1   2

octave:6> ii=x+dim(1)*y
ii =

    3    9   15
    4   10   16
    5   11   17
    6   12   18

octave:7> A(ii)
ans =

    3    5    7
    4    6    8
    5    7    9
    6    8   10

octave:8> B=reshape(A(ii),sqrt(n),sqrt(n),dim(2))
B =

ans(:,:,1) =

   3   5
   4   6

ans(:,:,2) =

   5   7
   6   8

ans(:,:,3) =

    7    9
    8   10

xとyの生成方法によっては、乗算を廃止することもできますが、それはお任せします。:D

IMOは、それらを格納するためのセル配列も必要ありません。3Dマトリックスも同様に機能し、同じ方法でインデックスを作成します(ただし、使用する前にスクイーズすることを忘れないでください)。

私はこの質問で同様の答えを出しました

于 2012-11-27T03:52:08.700 に答える