私はn
*m
行列を持っています、例えばA
。m
次の**マトリックスを作成したいと思いますm
。n
B
for j=1:n
B(:,:,j)=diag(A(j,:));
end
ループせずにこれを行うにはどうすればよいですか?
ありがとう
私はn
*m
行列を持っています、例えばA
。m
次の**マトリックスを作成したいと思いますm
。n
B
for j=1:n
B(:,:,j)=diag(A(j,:));
end
ループせずにこれを行うにはどうすればよいですか?
ありがとう
更新:サンプルコードのタイプミスを修正するために質問を編集しました。
A
現在、マトリックスには目的がなく、ループする添え字も使用されていないため、サンプルコードにはいくつかのタイプミスが含まれていると確信していますj
。ただし、実際に質問しようとしているのは、次のとおりA
です。ループを実行せずに、各対角線(3次元に沿って移動)がからの行である3D配列を作成するにはどうすればよいですか?
これが正しければ、1つの答えは次のとおりです。
%# A loop-less solution
Soln2 = zeros(M, M, N);
Soln2(bsxfun(@plus, (1:M+1:M*M)', (0:M^2:(N-1)*M^2))) = A';
基本的に、私が行ったのは、ソリューションの3D配列を事前に割り当ててbsxfun
から、3次元に沿って移動するすべての対角線の線形インデックスを作成するために使用することです。A
次に、 (列ではなく行が必要なため)の転置をソリューション配列の線形インデックスに割り当てます。
以下のテスト目的で、いくつかのサンプルコードを貼り付けました。あなたのループベースのソリューションの私の解釈があなたが本当に求めているものであることを確認してください。
%# Set some parameters and create a random matrix A
N = 3;
M = 4;
A = randi(5, N, M);
%# Your loop based solution
Soln1 = nan(M, M, N);
for n = 1:N
Soln1(:,:,n) = diag(A(n,:));
end
%# A loop-less solution
Soln2 = zeros(M, M, N);
Soln2(bsxfun(@plus, (1:M+1:M*M)', (0:M^2:(N-1)*M^2))) = A';