确定一个矩阵大小,您可以轻松地适应您的可用RAM。例如,如果您有一台4GB的机器,您应该能够轻松地存储一个占用大约800 GB的矩阵。将此值存储在变量
Mb中。使用以下信息计算可以存储在Mb内存中的最大矩阵维度N。
1024千字节1024字节8 bytes。N × N矩阵包含N^2浮点数。调用计算nmax的N。
(b)创建两个大小分别为A和B的随机矩阵Nmax × Nmax。使用MATLAB函数tic和toc,确定计算产品AB所需的时间(秒)。确定浮点运算(加法和乘法)的数目,计算Nmax × Nmax矩阵-矩阵积(2/3)n^3.,使用这个数字估计计算机每秒可以执行的浮点操作数(“flops”)。把这个错误率称为flops。
% Part A
nmax = sqrt((1600*1024*1024)/8); % 8GB of RAM
% Part B
A = (nmax:nmax);
B = (nmax:nmax);
tic
prod = A*B;
prod_time = toc
flops = (2/3)*(prod).^3一切运行良好,但我觉得我没有为值A和B创建矩阵。我做错了什么?
发布于 2018-03-02 09:05:40
主要有两件事:您混淆了矩阵的分配;c:c,其中c是一个常量,只返回常量。冒号:创建数组,如
c = 5;
N = 1:c
1 2 3 4 5向冒号操作符输入相同的起始点和端点,显然只返回这个点。
第二:操作的总数与元素的数量成正比,而不是矩阵积的实际结果(实际上,我们只是对时间感兴趣)。因此,首先计算FL,,oating,,O,的总数。
还记得我们用过tic/toc吗?那么,也许我们应该找出总时间是什么,它存储在prod_time中。这是执行矩阵乘法所需的秒数。Totflops除以prod_time给出了FLoating Operations Per S>E 219econd,即FLOPS。
[~,systemview] = memory; % Get RAM info
tmp = systemview.PhysicalMemory;
% tmp.Total stores the total system RAM
Mb = 0.2*((tmp.Total/(1024^2))); % 20% of the total RAM
% floor your nmax to force it to be integer
nmax = floor(sqrt((Mb*1024^2/8))); % create your nmax
A = rand(nmax); % random nmax x nmax matrix
B = rand(nmax); % random nmax x nmax matrix
tic
prod = A*B;
prod_time = toc;
% Total flops
Totflops = (2/3)*(nmax).^3;
flops = Totflops/prod_time; % flops/sec在我的系统上(8GB内存和i5 750 2.66GHz)提供flops = 1.0617e+10
https://stackoverflow.com/questions/49065472
复制相似问题