根据公式和表格在矩阵中对角更改数据

时间:2019-03-23 12:23:46

标签: matlab

让我说我有这个矩阵:

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

对角线“ Matrix(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 :(得分:0)

您的问题不是很清楚。如果az1,az2,delz,visc是常数,并且kzz1 = kzz(rowIndex),kzz2 = kzz(columnIndex)就像您的示例中那样,则对于您要尝试的事情似乎是可以的。 / p>

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