Matlab - Применение и обращение операций к матрице - PullRequest
0 голосов
/ 10 января 2019

Я делаю проект по МРТ диффузии. Я пытался применить уравнение, Sb = s0 * exp ((- 1) * bd), где b представляет собой набор симметричного тензора 3x3, связанного с направлением и величиной магнитного поля, d представляет собой тензор 3x3, связанный с направлением и величиной диффузии s0 - изображение без диффузии, а '.' является внутренним произведением Фробениуса (сумма произведений соответствующих записей).

Затем я пытаюсь проверить свой метод, отменив операцию возврата d, вычислив b.d = -ln (Sb / s0). Поскольку 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 бентеров, я смогу решить для коэффициентов d путем простого уменьшения строки расширенной матрицы или умножения ln (Sb / s0) на обратную матрицу, содержащую коэффициенты из бенторов.

За исключением случаев, когда я делаю это в коде, он говорит, что коэффициенты 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

Любая помощь будет принята с благодарностью, и большое спасибо за ваше время и опыт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...