MATLAB爱好者论坛-LabFans.com

MATLAB爱好者论坛-LabFans.com (https://www.labfans.com/bbs/index.php)
-   资料存档 (https://www.labfans.com/bbs/forumdisplay.php?f=72)
-   -   在MATLAB中一般导入上三角矩阵 (https://www.labfans.com/bbs/showthread.php?t=26533)

poster 2019-12-14 20:13

在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.