File Exchange

image thumbnail


version 1.0 (1.77 KB) by

Write 3D matrices to VTK files viewable with Paraview.



No License

This writes a 3D matrix to a VTK file. An old text-based format is used because it is easy to write to. This may result in very large file sizes.

The matrix is normalised, kind of. Not sure why I did that; it might not be needed. The code is very short so feel free to experiment!


WriteToVTK(matrix, filename)


m = reshape(magic(6), [3 3 4]);
WriteToVTK(m, 'magic.vtk');

Comments and Ratings (7)

thanks for your code.
I met a problem in useing it
    v = round(100 .* v(:) ./ mx);

The data format of I used is decimal,so I modified the code.
    v = 100 .* v(:) ./ 100;
But the result is not correct.
Could you give some help?

jie wang

Thanks for your code, it is really helpful.

Top !


Actually, i just modified the file to be more general to scalar data, using signed, floating points. No need to normalize, no need to have positive values :

For that, one can simply change " SCALARS blah char "
to "SCALARS blah float".
Then instead of :
fwrite(fid, num2str(v'));

use, for instance with a precision of 3 digits :

which will add only one blank space between each value whether it is positive or negative. (fwrite would actually add 2 blanks if the value is positive, fprintf understands the \040 ascii code as it's supposed to).

So, finally, we'd have :

fwrite(fid, ['# vtk DataFile Version 2.0' nl 'Volume example' nl 'ASCII' nl ...
    num2str(N) ' ' num2str(M) ' ' num2str(O) nl 'ASPECT_RATIO 1 1 1' nl ...
    'ORIGIN 0 0 0' nl 'POINT_DATA ' ...
    num2str(N*M*O) nl 'SCALARS matlab_scalars float 1' nl 'LOOKUP_TABLE default' nl]);

for z = 1:O
    % Get this layer.
    v = matrix(:, :, z)';
    % Scale it. This assumes there are no negative numbers. I'm not sure
    % this is actually necessary.
    v = v(:)';
    % Write the values as text numbers.
    % Newline.
    fwrite(fid, nl);

Tested with Paraview 4.1. Worked like charm.


According to your code, one should be careful as for the X and Y dimension. VTK structured data have x coordinates increasing faster, then y, and z.
By doing v = matrix(:, :, z);, the Y coordinates (rows) increase faster. Thus the VTK reader will assimilate the rows as the X dimension. So unless we transpose the matrix before sending it to writeToVTK, the VTK reader (paraview) will show us a transposed version of our arrays, X/Y -> Y/X. Am i correct ?

Good for export to VTK of matrices only.


Nate (view profile)

Awesome! Great for viewing 3-D level-set data...and then making quick stereo movies in paraview..thanks Tim.

MATLAB Release
MATLAB 7.6 (R2008a)

Download apps, toolboxes, and other File Exchange content using Add-On Explorer in MATLAB.

» Watch video