Сделайте общий импорт верхней треугольной матрицы в MATLAB - PullRequest
2 голосов
/ 08 марта 2011

Я пытался сделать общий импорт ответа Гауля на мой ранее вопрос об импорте верхней треугольной матрицы.

Исходные данные:

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

Является ли этот подход лучшим? Там должно быть что-то лучше. Я помню, кто-то сказал мне, чтобы я старался не использовать циклы for в MATLAB.

UPDATE
Так что это результат. Есть ли способ сделать это быстрее без петли?

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 ]

3 голосов
/ 08 марта 2011

Вот еще одно общее решение, которое должно работать для верхней треугольной матрицы любого размера. Он использует функции 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
2 голосов
/ 08 марта 2011

Вот один из способов без петли. Если у вас есть более свежая версия 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...