我一直试图将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)';
答案 0 :(得分:3)
这是另一种适用于任何尺寸的上三角矩阵的通用解决方案。它使用函数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
答案 1 :(得分:2)
这是没有循环的一种方式。如果您有更新版本的Matlab,您可能想要检查哪个解决方案真的更快,因为循环不像以前那么糟糕。
A = A'; %'# transpose so that linear indices get the right order
out = tril(ones(size(A))); %# create an array of indices
out(out>0) = A(~isnan(A)); %# overwrite the indices with the right number
out = out + triu(out',1); %'# fix the upper half of the array