在MATLAB中对上三角矩阵进行一般导入

时间:2011-03-08 15:48:21

标签: matlab matrix

我一直试图将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)';

2 个答案:

答案 0 :(得分:3)

这是另一种适用于任何尺寸的上三角矩阵的通用解决方案。它使用函数ROT90SPDIAGSTRIU

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