4

私は現在、次元 N xtx t の配列 A を持っています。次の形式の 2D マトリックス N xt を作成します。

B = [ A[:,1,1] A[:,2,2],...,A[:,t,t]]

明らかに、これを行う 2 つの方法は、完全に書き出すこと (t が大きいため非現実的) とループ (潜在的に遅い) です。ループなしでこれを行う方法はありますか。私がやればうまくいくと思いました:

B = A[:,[1:end],[1:end]]

しかし、それで元のマトリックスが返されました。

4

3 に答える 3

3

これがその主題に関する私の見解です:

mask = repmat(logical(permute(eye(size(A,2)), [3 1 2])), size(A,1), 1);
newA = reshape(A(mask), size(A,1), []);

マスクを生成して適用し、結果を正しい形状に変形するだけです。

編集:

またはさらに簡単です:

newA = A(:, logical(eye(size(A,2))))

または同じ線に沿って、

newA = A(:, diag(true(size(A,2),1)));

これは少し速いです。

于 2013-06-26T14:12:26.660 に答える
1

MATLAB はベクトルと行列に非常に優れていますが、「一般的な配列」に関しては、「一般的な方法」に切り替える必要があることがよくあります。行列/ベクトルを簡単に操作することに慣れていると、これは本当にぎこちなく、後ろ向きで、あまり便利ではないように思えます (実際には非常に擁護できる理由がありますが、それについては別の機会に説明します :)。

以下のバージョンは、各ページを介してループしarrayfun(これは、大きな行列の通常のループよりも高速です)、diag各ページで次の呼び出しを行います。

% "flip" the array, so that 3rd dimension becomes the 1st (rows), and 
% the 1st dimension becomes the 3rd, so that each "page" is a regular 
% matrix. You want the diagonals of all these matrices.
b = permute(a, [3 2 1]);

% Now "loop" through the pages, and collect the matrix diagonal for each page
c = arrayfun(@(ii)diag(b(:,:,ii)), 1:size(b,3), 'UniformOutput', false);

% The above will output a cell-array, which you can cast back to 
% a numeric matrix through this operation: 
A = [c{:}];
于 2013-06-26T13:42:39.587 に答える