假设我在MATLAB中有一个维数A的矩阵Nx(N-1)。
N=5;
A=[1 2 3 4;
5 6 7 8;
9 10 11 12;
13 14 15 16;
17 18 19 20 ];我想将A转换为NxN矩阵B,只需添加一个零对角线,即,
B=[ 0 1 2 3 4;
5 0 6 7 8;
9 10 0 11 12;
13 14 15 0 16;
17 18 19 20 0];这个代码实现了我想要的结果:
B_temp = zeros(N,N);
B_temp(1,:) = [0 A(1,:)];
B_temp(N,:) = [A(N,:) 0];
for j=2:N-1
B_temp(j,:)= [A(j,1:j-1) 0 A(j,j:end)];
end
B = B_temp; 你能提出一种有效的方法把它矢量化吗?
发布于 2018-09-21 09:31:22
如果要在矩阵的对角线上插入任何向量,可以使用普通索引。下面的片段给出了所需对角线的索引,给定方阵n的大小(矩阵是n by n),以及对角线k的数目,其中k=0对应于主对角线,k的正数对应于上对角,k的负数对应于下对角线。ixd最终给出了2D索引。
function [idx] = diagidx(n,k)
% n size of square matrix
% k number of diagonal
if k==0 % identity
idx = [(1:n).' (1:n).']; % [row col]
elseif k>0 % Upper diagonal
idx = [(1:n-k).' (1+k:n).'];
elseif k<0 % lower diagonal
idx = [(1+abs(k):n).' (1:n-abs(k)).'];
end
end用法:
n=10;
k=3;
A = rand(n);
idx = diagidx(n,k);
A(idx) = 1:(n-k);
https://stackoverflow.com/questions/47713435
复制相似问题