matlab - 在 MATLAB 中一般导入上三角矩阵

标签 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)';

最佳答案

这是另一个适用于任何大小的上三角矩阵的通用解决方案。它使用函数 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/

相关文章:

matlab - 通过 "List of Points"访问矩阵元素

matlab - 关于如何解决稀疏 OLS - 如何在 Matlab 中应用 `l1` 最小化(教育目的)

c++ - 链接的外部 DLL 中 std::vector 的 Mex 动态内存管理问题;段错误

c - 为什么我的矩阵没有相加?

java - Android屏幕坐标到 Canvas View 坐标

c - 如何从 C 中的列主矩阵中提取 vector ?

matlab - MATLAB 中的石头剪刀布

matlab - 如何在matlab中从向量中删除特定值?

matlab - Matlab 中的列选择

matlab - 多个矩阵乘以多个向量的快速乘法