Constructing a structure array:
N = 2;
S = struct('matrix_field',permute(num2cell(rand(3,3,N),[1 2]),[1 3 2]),'other_field',{'something','else'})
S(1)
S(2)
If it's convenient for subsequent operations you need to do, you can concatenate all N 3x3 matrices into a 3x3xN array and take the square root of that, resulting in another 3x3xN array:
M = sqrt(cat(3,S.matrix_field));
disp(M)
Otherwise, you can use arrayfun, which is a loop, and which results in a cell array of 3x3 matrices:
C = arrayfun(@(s)sqrt(s.matrix_field),S,'UniformOutput',false)
celldisp(C)
Since that gives you a cell array, it's convenient to put the result in a new field in the original structure array, if that's ultimately what you want:
[S.sqrt_matrix_field] = C{:}
S(1).sqrt_matrix_field
S(2).sqrt_matrix_field
Both of those approaches take the square root of each element of each matrix. Since you mentioned taking the square root of each row of each matrix, I'll make a guess at what that means (squaring each element, summing across each row, and taking the square root of that), and show it using both approches.
First the concatenation approach:
M = sqrt(sum(cat(3,S.matrix_field).^2,2));
disp(M)
It may be convenient to permute that 3x1xN array into a 3xN matrix:
M = permute(M,[1 3 2])
And the arrayfun approach:
C = arrayfun(@(s)sqrt(sum(s.matrix_field.^2,2)),S,'UniformOutput',false)
celldisp(C)
And putting those results into the original structure array:
[S.sqrt_matrix_field] = C{:}
S(1).sqrt_matrix_field
S(2).sqrt_matrix_field
You could also concatenate the contents of each cell of C together to form a 3xN matrix:
M = [C{:}]
but if that's the form of the result you need, it's better to skip the cell array entirely and use the concatenation approach.