![]() |
在MATLAB中一般导入上三角矩阵
我一直在试图对我先前关于导入上三角矩阵的[URL="https://stackoverflow.com/questions/5230115/how-to-load-this-kind-of-matrix-in-matlab"]问题[/URL] [URL="https://stackoverflow.com/questions/5230115/how-to-load-this-kind-of-matrix-in-matlab/5230518#5230518"]的回答[/URL]提出一个普遍的[URL="https://stackoverflow.com/questions/5230115/how-to-load-this-kind-of-matrix-in-matlab/5230518#5230518"]看法[/URL] 。
[B]初始数据:[/B] 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 [B]我有这个,所以我们可以得到任何大小的完整矩阵:[/B] 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循环。 [B]更新[/B] 所以这就是结果。有没有什么方法可以使其更快而不循环? 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)'; [B]回答:[/B] 这是适用于任何大小的上三角矩阵的另一个通用解决方案。它使用函数[URL="http://www.mathworks.com/help/techdoc/ref/rot90.html"]ROT90[/URL] , [URL="http://www.mathworks.com/help/techdoc/ref/spdiags.html"]SPDIAGS[/URL]和[URL="http://www.mathworks.com/help/techdoc/ref/triu.html"]TRIU[/URL] : >> 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 [url=https://stackoverflow.com/questions/5234785]更多&回答...[/url] |
所有时间均为北京时间。现在的时间是 10:57。 |
Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.