4

Aサイズの 4 次元行列がありますNxNxPxQNxNベクトル化された方法で各 2 次元部分行列の対角値を 1 に簡単に変更するにはどうすればよいですか?

4

3 に答える 3

3

gnovice の提案を組み込むと、要素にインデックスを付ける簡単な方法は次のとおりです。

[N,~,P,Q]=size(A);%# get dimensions of your matrix

diagIndex=repmat(logical(eye(N)),[1 1 P Q]);%# get logical indices of the diagonals    
A(diagIndex)=1;%# now index your matrix and set the diagonals to 1.
于 2011-03-15T23:37:48.703 に答える
2

実際には、すべての対角要素の線形インデックスを直接計算し、それらを 1 に設定することで、これを非常に簡単に行うことができます。

[N,N,P,Q] = size(A);
diagIndex = cumsum([1:(N+1):N^2; N^2.*ones(P*Q-1,N)]);
A(diagIndex) = 1;

上記の例では、最初の行列 ( ) の対角Nインデックスを見つけます。後続の-by-行列 (の) はそれぞれ、最後の行列から要素によってオフセットされるため、値のみを含む-by-列のサイズの行列が、最初の行列の対角線の線形インデックスに追加されます。関数CUMSUMを使用して各列に対して累積和を実行すると、結果の行列には 4 次元行列のすべての対角要素の線形インデックスが含まれます。NN1:(N+1):N^2NNP*Q-1N^2PQ-1NN^2

于 2011-03-16T04:47:55.847 に答える
0

直接インデックスを使用し、repmatをいじくり回して、各50x50ブロックのより大きなマトリックス内のオフセットに単一の50x50対角線のインデックスを追加できます。

小さな問題の例を次に示します。

A = NaN(10,10,5,3);
inner = repmat(sub2ind([10 10], [1:10],[1:10]), 5*3, 10); % diagonals
outer = repmat([10*10 * [0:5*3-1]]', 1, 10*10); % offsets to blocks
diags = inner + outer;
A(diags(:)) = 1;
于 2011-03-16T00:00:22.917 に答える