A
サイズの 4 次元行列がありますNxNxPxQ
。NxN
ベクトル化された方法で各 2 次元部分行列の対角値を 1 に簡単に変更するにはどうすればよいですか?
1827 次
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 次元行列のすべての対角要素の線形インデックスが含まれます。N
N
1:(N+1):N^2
N
N
P*Q-1
N^2
PQ-1
N
N^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 に答える