Matlab-在矩阵上应用和反转操作

时间:2019-01-10 03:09:09

标签: matlab

我正在做一个有关弥散MRI的项目。我一直在尝试应用一个方程Sb = s0 * exp((-1)* bd),其中b是与磁场的方向和大小相关的一组对称3x3张量,d是与之相关的3x3张量根据扩散的方向和幅度,s0是没有扩散的图像,而'。'是Frobenius内积(相应条目的乘积之和)。

然后,我尝试通过计算b.d = -ln(Sb / s0)来反转操作以返回d来验证我的方法。由于b是对称的,所以我假设

b(1,1)d(1,1)+ b(2,2)d(2,2)+ b(3,3)d(3,3)+ 2 * b(1,2) d(1,2)+ 2 * b(1,3)d(1,3)+ 2 * b(2,3)d(2,3)= -ln(Sb / s0)

如果我至少有6个张量,我应该能够通过仅对扩展矩阵进行行缩减或将ln(Sb / s0)乘以包含来自张量系数的矩阵的逆来求解d系数。 / p>

除了我在代码中进行编码时,它说d系数是不确定的。

这是代码,它是我正在使用的代码的简化:

 % Get b values:
G = [-0.049 -0.996  -0.074;
    -0.996  0.043   0.080;
    0.078   -0.078  0.994;
    0.498   -0.556  -0.665;
    -0.524  -0.663  0.535;
    0.708   0.344   0.617;];

B1 = zeros(3,3,6);
for i = 1:6
    B1(:,:,i) = G(i,:)'*G(i,:);
end

% Get btensors

btensor = cell(1,6);
for j = 1:6
    btensor{1,j} = 1000.*(B1(:,:,j)./sum(diag(B1(:,:,j))));
end

% Set up a test matrix, D.
D = [1 2 3; 2 4 5; 3 5 6];
s0 = 2;
Sb = zeros(6,1);
track=zeros(6,1);

% Solve Sb = S0*exp(-dot(b,D)) for the 32 b-matrices
for i=1:6
    track(i,1) = (-1)*sum(dot(D, btensor{1,i}));
    Sb(i,1) = exp((-1)*sum(dot(D, btensor{1,i})));
end

disp(track);
disp(Sb);

% Now work backwards using Sb to solve for D.
bCoefficients = zeros(6,6);
for i=1:6
    bCoefficients(i,:) = [btensor{1,i}(1,1), btensor{1,i}(2,2), btensor{1,i}(3,3), btensor{1,i}(1,2), btensor{1,i}(1,3), btensor{1,i}(2,3)];
end

delta = inv(bCoefficients);

dc = delta*(-log(Sb/s0));
disp(dc);

这是我的-ln(Sb / s0),exp(-ln(Sb / s0))和D ...的值的输出,这些值不在原始矩阵中:

        -4957.86349139358
         -422.707982384668
          -5623.0249029198
         -4743.73827380387
          89.2069934124379
         -8973.85255661114

                         0
     2.63181764233683e-184
                         0
                         0
      5.52210914427115e+38
                         0

   NaN
   NaN
   NaN
   NaN
   NaN
   NaN

非常感谢您的帮助,非常感谢您的时间和专业知识。

0 个答案:

没有答案