让我说我有这个矩阵:
(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
答案 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