您可以使用矩阵的上下三角形部分(triu 和 tril)来执行此操作。
那就是 1 行解决方案:
B = [tril(A,-1) zeros(N, 1)] + [zeros(N,1) triu(A)];
编辑:基准测试
这是循环方法、Sardar's answer中的2种方法和我上面的方法的对比。
基准代码,使用timeit 进行计时并直接从问答中提取代码:
function benchie()
N = 1e4; A = rand(N,N-1); % Initialise large matrix
% Set up anonymous functions for input to timeit
s1 = @() sardar1(A,N); s2 = @() sardar2(A,N);
w = @() wolfie(A,N); u = @() user3285148(A,N);
% timings
timeit(s1), timeit(s2), timeit(w), timeit(u)
end
function sardar1(A, N) % using eye as an indexing matrix
B=double(~eye(N)); B(find(B))=A.'; B=B.';
end
function sardar2(A,N) % similar to sardar1, but avoiding slow operations
B=1-eye(N); B(logical(B))=A.'; B=B.';
end
function wolfie(A,N) % using triangular parts of the matrix
B = [tril(A,-1) zeros(N, 1)] + [zeros(N,1) triu(A)];
end
function user3285148(A, N) % original looping method
B = zeros(N,N); B(1,:) = [0 A(1,:)]; B(N,:) = [A(N,:) 0];
for j=2:N-1; B(j,:)= [A(j,1:j-1) 0 A(j,j:end)]; end
end
结果:
- Sardar 方法 1:2.83 秒
- Sardar 方法 2:1.82 秒
- 我的方法:1.45 秒
- 循环方法:3.80 秒 (!)
结论:
- 您希望将其矢量化是有根据的,循环比其他方法慢得多。
- 避免对大型矩阵进行数据转换和
find 很重要,Sardar 的方法之间可以节省约 35% 的处理时间。
- 通过避免同时编制索引,您可以进一步节省 20% 的处理时间。