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)
初始数据:
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)