Prerequisites

Alex Cerjanic (acerj@udel.edu)
Welcome, dear reader! These interactive documents will attempt to give you a gentle, but thorough introduction to the fundamentals of iterative MRI reconstruction as used in non-Carteisan applications, such as spiral imaging. This time, we will focus on the nuts-and-bolts basics we need for our discussions going forward. Some of this discussion will center on developing our shared vocabulary in words and in mathematics.
Please note MNL lab members: This section will be updated as we progress with the journal club to include useful math and notation. Please check back for updates.
Learning Objectives:

Estabishing a common vocabulary

Image reconstruction as an application of row vector-column vector and matrix-vector operations

When we start working with image reconstruction problems, we will often formulate reconstruction problems in terms of matrix-vector operations. We do this not to bring back bad memories of learning matrix multiplications or finding determinants by hand, but to simplify how we notate the problems, and organize how we think about, and implement solutions to reconstruction problems via computer.
We will start simply, by reminding ourselves that any 2D or 3D (or 4D or 5D and so on) image can be represented by a single 1D column vector. Starting with a 2D array representation of an image, we can certainly visualize it.
x = phantom('Modified Shepp-Logan',64); % Generate a 64x64 image
size(x)
ans = 1×2
64 64
im(x), colormap(gray), drawnow
And just to prove it to ourselves, we can reshape the 2D array into a 1D array. We use the handy "col" function from the MIRT for this function. The text of the function is provided for your reference.
% function x = col(x)
% %function x = col(x)
% % "colon" function
% x = x(:);
% %x = reshape(x,[],1);
x = col(x);
size(x)
ans = 1×2
4096 1
im(reshape(x, [64,64]))
Likewise, we often will represent summations at row-vector column multiplications. Below is an example of this kind of notation.
This both for notational purposes (look how much more compact the right is compared to the left, dear reader!), as well as computational reasons. Let's see a reason why we might want to do this in MATLAB code below:
a = col(0:.01:100); % Generate a column vector of floating point numbers
x = col(0:.01:100); % Generate a column vector of floating point numbers.
% Implement the summation naively
tic
y = 0;
for ii=1:length(a)
y = y + a(ii) * x(ii);
end
disp(y)
3.3338e+07
toc
Elapsed time is 0.026268 seconds.
% Implement the summation as a row vector operation
tic
y = a'*x;
disp(y)
3.3338e+07
toc
Elapsed time is 0.006047 seconds.
So, dear reader, what happened? We got the same answer both ways, but the summation required 4 lines of code and a for loop to implement. It was also almost 4 times slower than the one line row-vector operation. Neat!

Until Next Time!