Изменение данных по диагонали в матрице на основе формулы и таблицы - PullRequest
0 голосов
/ 23 марта 2019

Пусть говорит, что у меня есть эта матрица:

                        (x)
 X = [1     1     1     0     1     0     0     0;
      1     1     0     1     0     1     0     0;
      1     0     1     1     0     0     1     0;
      0     1     1     1     0     0     0     1;
      1     0     0     0     1     1     1     0;
      0     1     0     0     1     1     0     1;
      0     0     1     0     1     0     1     1;
      0     0     0     1     0     1     1     1];

и эта таблица:

        kzz   
      _______

1        80
2        80
3        23
4        14
5        63
6        36 
7        41     
8         5 

и это уравнение:

 f = (1/visc)*((2*kzz2*kzz1*az2*az1)/(kzz2*az2*delz+kzz1*az1*delz)

visc = 2
az2 = 6400
az1 = 6400
delz = 30
kzz1 = ? < From the table
kzz2 = ? < From the table

 f = (1/2)*((2*kzz2*kzz1*6400*6400)/(kzz2*6400*30+kzz1*6400*30)

это уравнение представляет диагональначалось со столбца 5 в матрице, чуть ниже (X).


Требуемая задача: изменить числа в этой диагонали на это уравнение:

f = (1/2)*((2*kzz2*kzz1*6400*6400)/(kzz2*6400*30+kzz1*6400*30)

Дляпервое значение в диагонали «Матрица (5,1)» kzz2 = 63 и kzz1 = 80 <<, полученное из таблицы </p>

, следовательно, уравнение будет следующим:

f = (1/2)*((2*63*80*6400*6400)/(63*6400*30+80*6400*30)

поэтому, основываясь на расположении в матрице, код должен взять значение из таблицы и подставить его в уравнение.

Мой тест:

k = (4);
d = diag(Matrix,k); 
n = d;
n(n==1) = f; 
XX = XX - diag(d,k) + diag(n,k); 

Пример требуемого вывода

результат должен выглядеть следующим образом (мнимые числа)

 1     1     1     0     5     0     0     0
 1     1     0     1     0     8     0     0
 1     0     1     1     0     0     9     0
 0     1     1     1     0     0     0     2
 1     0     0     0     1     1     1     0
 0     1     0     0     1     1     0     1
 0     0     1     0     1     0     1     1
 0     0     0     1     0     1     1     1

другие уравнения будут использоваться для изменения других диагоналей для получения этого результата:

 1     2     1     0     5     0     0     0
 1     1     0     1     0     8     0     0
 1     0     1     6     0     0     9     0
 0     1     1     1     0     0     0     2
 1     0     0     0     1     7     1     0
 0     1     0     0     1     1     0     1
 0     0     1     0     1     0     1     4
 0     0     0     1     0     1     1     1

1 Ответ

0 голосов
/ 23 марта 2019

Ваш вопрос не очень понятен. Если az1, az2, delz, visc являются константами и kzz1 = kzz (rowIndex), kzz2 = kzz (columnIndex), как это выглядит в вашем примере, похоже, это нормально для того, что вы пытаетесь сделать.

az1 = 6400;
az2 = 6400;
delz = 30;
visc = 2;

i=0;
for j=5:8
    i=i+1;
    X(i,j) = (1/visc)*(2*kzz(j)*kzz(i)*az2*az1)/(kzz(j)*az2*delz+kzz(i)*az1*delz);
end

Если вы хотите обобщить диагональ, начинающуюся с startColumnIndex, цикл for может выглядеть примерно так:

i=0;
startColumnIndex = 5;
numberOfColumns = size(X,2);
for j = startColumnIndex : numberOfColumns
    i=i+1;
    .....stuff you want to do......
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...