Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Save .mat file, use -v7.3 switch?

I'm running an m-file, creating two variables, Clus and Watts_Map. I want to save both variables to a file that ends in ".mat". Both are variables are dimensioned as (1152,241,319), with 1152 as 360 deg longitude in 0.3125 deg increments, 241 as latitude from 30S-30N in 0.25 deg increments, over 319 time steps. Code works all the way until the end, where I get the error:

[Warning: Variable 'Clus' cannot be saved to a MAT-file whose version is older
than 7.3.
To save this variable, use the -v7.3 switch.
Skipping...] 
[Warning: Variable 'Watts_Map' cannot be saved to a MAT-file whose version is
older than 7.3.
To save this variable, use the -v7.3 switch.
Skipping...] 

I am using Matlab version R2014a, so would think that this is the most current version. Also, I have run the same exact code over a smaller spatial domain (but over 2920 timesteps) without error.

%  Clear all variables, initialize counter, indexed by timestep
clc;
clear all;

rain = NaN(1152,241,319);
Clus = NaN(1152,241,319);
Areas_Final = NaN(500,319); 
Wattage_Final = NaN(500,319);
Cluster_size = zeros(319,1);
Watts_Map = zeros(1152,241,319);

for year = 2000%:2008;
    Nyear = sprintf('%04d',year);

    %  Call on the files for each year
    filename = (['pr_3hr_GFDL-HIRAM-C360_amip_r1i1p1_' num2str(Nyear) '010100-' num2str(Nyear) '123123_subset_TROPICS.nc']);
    disp(filename)
    disp(year)

    rain_rate = ncread(filename,'pr');

    %  Call on each timestep
    for i = 960:4:2236; % Approx May 1st-Sep 30th

        %  Set extract subset for region, mask land areas, for each
        %  timestep

        disp(i)
        rain = rain_rate(:,:,i);

        % Eliminate bad/no data points
        index_rain = (rain >= (5.4e-05)) & (rain < 1e-2); % 0.2mm/hr is min rain rate

        % Cluster each morning and afternoon matrix
        Clus(:,:,i) = cluster_it(index_rain);

        % Calculate cluster areas
        Areas = cluster_areas_TROPICS(Clus(:,:,i));
        Areas_Final(1:length(Areas),i) = Areas;

        % Calculate cluster wattages
        Wattage = cluster_wattage(Clus(:,:,i),rain);

        Cluster_size(i,1) = max(max(Clus(:,:,i)));

        % Create dummy matricies to populate and use to create the wattage
        % maps
        D = zeros(1152,241);
        E = squeeze(Clus(:,:,i));
        for index = 1:Cluster_size(i);
            D(E == index) = Wattage(index);
        end

        Watts_Map(:,:,i) = D;

        % Clear the dummy matricies
        clear D E

    end

    % Save the output as a .mat file
    file_out = sprintf(num2str(Nyear), year);
    matfile = [file_out '_TROPICS_Watts_Maps_inc_Land_low_rain_threshold.mat'];
    save(matfile, 'Clus', 'Watts_Map');

    % Clear unneeded variables to save memory and prevent overwriting
    clear index_rain rain Areas Wattage Clus file_out filename Areas_Final rain_rate Watts_Map Cluster_size year matfile

end
like image 363
Kevin_Q Avatar asked Jan 09 '23 08:01

Kevin_Q


1 Answers

Even in the current version, the default format is not v7.3. You must specify it:

save(matfile, '-v7.3', 'var1', 'var2');

You can also set the default in "General Preferences":

enter image description here

Note that v7.3 does compress data as of R2008a:

Compression of -v7.3 MAT-Files

You can store data items that are over 2 gigabytes in size in a MAT-file using the -v7.3 option for the save function. This option was introduced in MATLAB R2006b. With MATLAB R2008a, save now compresses these MAT-files.

I've seen file size blow up for v7.3 files, but that is history and perhaps it's better now.

like image 154
chappjc Avatar answered Jan 14 '23 21:01

chappjc