当规模巨大时,如何在 MATLAB 中将数组数据写入和读取文件?
How to write and read array data to a file in MATLAB when the scale is huge?
我现在正在使用类似 FDTD 的方法模拟抛物线微分方程。模拟区域不同,为了保持模拟的收敛性,网格的足迹很小,使得矩阵尺度很大,如2100*100000000。所以我不能在这个矩阵中直接运行模拟。
我选择在程序中只存储1列数据,每次循环结束时,我想将数据写入文件,将当前列附加到之前的列。模拟完成后,我会将此文件导入 MATLAB 并进行一些绘图,如 HeatMap.
这是我的示例代码:
for n = 1 : z
for m = 2 : (x - 1)
if ((mod(m, 54) < 15) && (mod(m, 54) > 0)) || ((mod(m, 54) < 42) && (mod(m, 54) > 27))
delta_2_E = E(m + 1) - 2 * E(m) + E(m - 1);
E(m) = alpha * delta_2_E + beta(m) * E(m);
end;
end
for m = 1 : x
if (mod(m, 54) == 0) || (mod(m, 54) == 1) || ((mod(m, 54) >= 15) && (mod(m, 54) == 28)) || ((mod(m, 54) >= 42) && (mod(m, 54) <= 53))
E(m) = 0;
end
end
intensity = abs(E);
fidresult = fopen('final_result.txt', 'w');
fprintf(fidresult,' %f\t %f\t %f\n',intensity);
fclose(fidresult);
end
现在问题来了:
- 如果我使用文本文件,它似乎无法包含 2100 行(如 MATLAB 中的矩阵)。再说它的体积打开起来会非常巨大。我应该,以及如何使用其他格式,如 .mat 文件?
- 我可以在可接受的时间内对数据矩阵进行HeatMap(假设它已成功存储和读取)吗?
- 如果上述方法实际上不起作用,是否有更好的模拟方法?
- 如果可能,我怎样才能保持数据的准确性?下降到大约 1e-6。
您可以将数据写入二进制文件 (ch.mathworks.com/help/matlab/ref/fwrite.html)。与 txt 文件相比,它的读取速度非常快 (fread
) 并且数据量很小。
您也可以只使用 hdf5 格式的 .mat 文件(取决于您的 matlab 版本)。您只需使用 save
命令
即可创建 .mat 文件
我现在正在使用类似 FDTD 的方法模拟抛物线微分方程。模拟区域不同,为了保持模拟的收敛性,网格的足迹很小,使得矩阵尺度很大,如2100*100000000。所以我不能在这个矩阵中直接运行模拟。
我选择在程序中只存储1列数据,每次循环结束时,我想将数据写入文件,将当前列附加到之前的列。模拟完成后,我会将此文件导入 MATLAB 并进行一些绘图,如 HeatMap.
这是我的示例代码:
for n = 1 : z
for m = 2 : (x - 1)
if ((mod(m, 54) < 15) && (mod(m, 54) > 0)) || ((mod(m, 54) < 42) && (mod(m, 54) > 27))
delta_2_E = E(m + 1) - 2 * E(m) + E(m - 1);
E(m) = alpha * delta_2_E + beta(m) * E(m);
end;
end
for m = 1 : x
if (mod(m, 54) == 0) || (mod(m, 54) == 1) || ((mod(m, 54) >= 15) && (mod(m, 54) == 28)) || ((mod(m, 54) >= 42) && (mod(m, 54) <= 53))
E(m) = 0;
end
end
intensity = abs(E);
fidresult = fopen('final_result.txt', 'w');
fprintf(fidresult,' %f\t %f\t %f\n',intensity);
fclose(fidresult);
end
现在问题来了:
- 如果我使用文本文件,它似乎无法包含 2100 行(如 MATLAB 中的矩阵)。再说它的体积打开起来会非常巨大。我应该,以及如何使用其他格式,如 .mat 文件?
- 我可以在可接受的时间内对数据矩阵进行HeatMap(假设它已成功存储和读取)吗?
- 如果上述方法实际上不起作用,是否有更好的模拟方法?
- 如果可能,我怎样才能保持数据的准确性?下降到大约 1e-6。
您可以将数据写入二进制文件 (ch.mathworks.com/help/matlab/ref/fwrite.html)。与 txt 文件相比,它的读取速度非常快 (fread
) 并且数据量很小。
您也可以只使用 hdf5 格式的 .mat 文件(取决于您的 matlab 版本)。您只需使用 save
命令