我一直在试图对我先前关于导入上三角矩阵的
问题 的回答提出一个普遍的
看法 。
初始数据:
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 ,
SPDIAGS和
TRIU :
>> 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
更多&回答...