随机Sampling/Matlab/Matrix
Random Sampling/Matlab/Matrix
我正在尝试创建一组 320 个矩阵,每个矩阵的尺寸为 1152 x 241。每个矩阵代表不同的时间步长。我正在尝试使用来自另一个文件的随机值来填充每个单元格。这个其他文件的尺寸也是 1152 x 241,但是有大约 2520 个时间步长可供选择。
所以应该发生的事情是选择一个单元格,用来自大文件的随机时间步长的值填充,然后移动到相邻的单元格并做同样的事情。重复直到创建了 320 个矩阵。
问题是我 运行 代码而且我只创建了一个矩阵。我需要做什么来修复我的代码以便创建 320 个矩阵?谢谢!
clear all;
clc;
% Load datafile
load 1979_1999_tropics_subset_3mmhr.mat
% Create empty maps
rain_fake_timeseries = zeros(1152,241,320);
for i = 1:1152; % set longitude
%disp(i)
for j = 1:241; % set latitude
%disp(j)
%for k = 1:320; % create map
%disp(k)
rain_fake_timeseries = datasample(rain_sample_1979_1999,1,3);
%disp(rain_fake_timeseries)
%save random_clus_fake_timeseries.mat rain_fake_timeseries -v7.3;
%end
end
end
save random_clus_fake_timeseries.mat rain_fake_timeseries -v7.3;
这是因为您没有正确索引到时间序列数组来存储数据。您正在做的是,您只保存时间序列数组中 最后随机 选择的切片。如果你仔细观察你的循环,你只是在 for
循环的每次迭代中覆盖输出数组。
您也没有正确创建 for
循环。如果我没理解错的话,切片中的每个位置都代表一个唯一的 (x,y)
坐标。对于您拥有的每个矩阵,您希望从这个完全相同的位置进行采样,但会暂时搜索您的 ~2500 个时间实例。因此,您需要使用所有循环变量 i
、j
和 k
来索引您的 3D 矩阵。您还需要访问位置 (i,j)
处的所有时间片并从所有时间片中随机采样。如果我可以建议一个小的优化更改,我们可以只用两个 for
循环而不是三个循环来做到这一点,在所有时间片的这个位置随机选择 320 个点,并将其存储到 3D 矩阵中。
换句话说:
clear all;
clc;
% Load datafile
load 1979_1999_tropics_subset_3mmhr.mat
% Create empty maps
rain_fake_timeseries = zeros(1152,241,320);
for i = 1 : size(rain_fake_timeseries,1)
for j = 1 : size(rain_fake_timeseries,2)
rain_fake_timeseries(i,j,:) = datasample(rain_sample_1979_1999(i,j,:), ...
size(rain_fake_timeseries,3), 3);
end
end
save random_clus_fake_timeseries.mat rain_fake_timeseries -v7.3;
请注意,我已将 for
循环中的维度替换为对 size
的调用,以便您可以轻松更改矩阵的大小,并且它仍然可以工作而无需更改任何常量。
我正在尝试创建一组 320 个矩阵,每个矩阵的尺寸为 1152 x 241。每个矩阵代表不同的时间步长。我正在尝试使用来自另一个文件的随机值来填充每个单元格。这个其他文件的尺寸也是 1152 x 241,但是有大约 2520 个时间步长可供选择。
所以应该发生的事情是选择一个单元格,用来自大文件的随机时间步长的值填充,然后移动到相邻的单元格并做同样的事情。重复直到创建了 320 个矩阵。
问题是我 运行 代码而且我只创建了一个矩阵。我需要做什么来修复我的代码以便创建 320 个矩阵?谢谢!
clear all;
clc;
% Load datafile
load 1979_1999_tropics_subset_3mmhr.mat
% Create empty maps
rain_fake_timeseries = zeros(1152,241,320);
for i = 1:1152; % set longitude
%disp(i)
for j = 1:241; % set latitude
%disp(j)
%for k = 1:320; % create map
%disp(k)
rain_fake_timeseries = datasample(rain_sample_1979_1999,1,3);
%disp(rain_fake_timeseries)
%save random_clus_fake_timeseries.mat rain_fake_timeseries -v7.3;
%end
end
end
save random_clus_fake_timeseries.mat rain_fake_timeseries -v7.3;
这是因为您没有正确索引到时间序列数组来存储数据。您正在做的是,您只保存时间序列数组中 最后随机 选择的切片。如果你仔细观察你的循环,你只是在 for
循环的每次迭代中覆盖输出数组。
您也没有正确创建 for
循环。如果我没理解错的话,切片中的每个位置都代表一个唯一的 (x,y)
坐标。对于您拥有的每个矩阵,您希望从这个完全相同的位置进行采样,但会暂时搜索您的 ~2500 个时间实例。因此,您需要使用所有循环变量 i
、j
和 k
来索引您的 3D 矩阵。您还需要访问位置 (i,j)
处的所有时间片并从所有时间片中随机采样。如果我可以建议一个小的优化更改,我们可以只用两个 for
循环而不是三个循环来做到这一点,在所有时间片的这个位置随机选择 320 个点,并将其存储到 3D 矩阵中。
换句话说:
clear all;
clc;
% Load datafile
load 1979_1999_tropics_subset_3mmhr.mat
% Create empty maps
rain_fake_timeseries = zeros(1152,241,320);
for i = 1 : size(rain_fake_timeseries,1)
for j = 1 : size(rain_fake_timeseries,2)
rain_fake_timeseries(i,j,:) = datasample(rain_sample_1979_1999(i,j,:), ...
size(rain_fake_timeseries,3), 3);
end
end
save random_clus_fake_timeseries.mat rain_fake_timeseries -v7.3;
请注意,我已将 for
循环中的维度替换为对 size
的调用,以便您可以轻松更改矩阵的大小,并且它仍然可以工作而无需更改任何常量。