我一直在尝试一般导入 Ghaul's answer到我之前的question关于导入上三角矩阵。
初始数据:
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 替换为其对称对应项:
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
关于matlab - 在 MATLAB 中一般导入上三角矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5234785/