У меня есть кривая, полученная из собственных значений матрицы. Я хочу закрыть эту кривую для другой кривой, которая является базовой. Для этого мне нужно смести ненулевые элементы этой матрицы. Поскольку матрица симметрична, я превращаю ее в верхнюю треугольную матрицу. Тогда я подумал, что ненулевые элементы этой матрицы должны быть найдены, поэтому для их числа следует использовать «For-Loop». Для простоты предположим, что от 90% до 1,1% в первую очередь значения любых ненулевых элементов хороши для развертки. Например, рассмотрим эту (2,2) матрицу:
`
A=[1 2;2 0],B=zeros(size(A)),
A=triu(A),
[row,col]=find(A~=0);
low_limit=0.9;step_limit=0.1;high_limit=1.1;
i=1;
for a=low_limit*A(row(i),col(i)):step_limit*A(row(i),col(i)):high_limit*A(row(i),col(i))
B(row(i),col(i))=a;B(col(i),row(i))=a;
i=i+1;% i increases for reaching next element
for b=low_limit*A(row(i),col(i)):step_limit*A(row(i),col(i)):high_limit*A(row(i),col(i))
B(row(i),col(i))=b;B(col(i),row(i))=b;
%after get eigenvalue,compare with the data of reference curve for minimum difference
end
i=i-1;% i decreases for reaching previous element
end
Как мы можем сделать это для матрицы с любым измерением? Есть ли способ избежать записи последовательных циклов? Я имею в виду, если есть, например, 40 ненулевых элементов, будет 40 "Для циклов" !!!
Если эта процедура недостаточно хороша, есть ли более эффективный способ?
Действительно, существует большое беспокойство по поводу количества циклов «For», которое снижает скорость, несмотря на распараллеливание.