登录论坛

查看完整版本 : 在MATLAB中一般导入上三角矩阵


poster
2019-12-14, 20:13
我一直在试图对我先前关于导入上三角矩阵的问题 (https://stackoverflow.com/questions/5230115/how-to-load-this-kind-of-matrix-in-matlab) 的回答 (https://stackoverflow.com/questions/5230115/how-to-load-this-kind-of-matrix-in-matlab/5230518#5230518)提出一个普遍的看法 (https://stackoverflow.com/questions/5230115/how-to-load-this-kind-of-matrix-in-matlab/5230518#5230518) 。

初始数据:

1.0 3.32 -7.23 1.00 0.60 1.00 A = importdata('A.txt') A = 1.0000 3.3200 -7.2300 1.0000 0.6000 NaN 1.0000 NaN NaN 因此,您将不得不移动最后两行,如下所示:

A(2,:) = circshift(A(2,:),[0 1]) A(3,:) = circshift(A(3,:),[0 2]) A = 1.0000 3.3200 -7.2300 NaN 1.0000 0.6000 NaN NaN 1.0000 然后用对称的NaN代替NaN:

A(isnan(A)) = A(isnan(A)') A = 1.0000 3.3200 -7.2300 3.3200 1.0000 0.6000 -7.2300 0.6000 1.0000 我有这个,所以我们可以得到任何大小的完整矩阵:

A = importdata('A.txt') for i = (1:size(A)-1) A(i+1,:) = circshift(A(i+1,:),[0 i]); end A(isnan(A)) = A(isnan(A)'); 这是最好的方法吗?必须有更好的东西。我记得有人告诉我不要在MATLAB中使用for循环。

更新
所以这就是结果。有没有什么方法可以使其更快而不循环?

A = importdata('A.txt') for i = (1:size(A)-1) A(i+1,:) = circshift(A(i+1,:),[0 i]) end A(isnan(A)) = 0; A = A + triu(A, 1)';

回答:

这是适用于任何大小的上三角矩阵的另一个通用解决方案。它使用函数ROT90 (http://www.mathworks.com/help/techdoc/ref/rot90.html) , SPDIAGS (http://www.mathworks.com/help/techdoc/ref/spdiags.html)和TRIU (http://www.mathworks.com/help/techdoc/ref/triu.html) :

>> A = [1 3.32 -7.23; 1 0.6 nan; 1 nan nan]; %# Sample matrix >> A = spdiags(rot90(A),1-size(A,2):0); %# Shift the rows >> A = A+triu(A,1).' %'# Mirror around the main diagonal A = 1.0000 3.3200 -7.2300 3.3200 1.0000 0.6000 -7.2300 0.6000 1.0000

更多&回答... (https://stackoverflow.com/questions/5234785)