确定您可以轻松适应您的矩阵大小 可用内存。例如,如果您有4 GB的计算机,则应该 能够舒适地存储占用大约800MB的矩阵。 将此值存储在变量
Mb
中。使用以下信息 计算可以存储在Mb中的最大矩阵维数N. 兆字节的内存。
兆字节有
1024
千字节千字节为
1024
字节浮点数为
8 bytes
。
N × N
矩阵包含N^2
个浮点数。调用您计算的N
nmax
。(b)创建两个大小为
A
的随机矩阵B
和Nmax × Nmax
。 使用MATLAB函数tic
和toc
,确定多长时间 (秒)计算产品AB
。确定数量 它需要浮点运算(加法和乘法) 计算Nmax × Nmax
矩阵 - 矩阵乘积(2/3)n^3.
使用 这个数字来估计每个浮点运算的数量 第二个('翻牌')你的电脑可以执行。拨打这个翻牌价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
创建矩阵。我做错了什么?
答案 0 :(得分:2)
两件主要的事情:你搞砸了你的矩阵作业;其中c:c
是常量的c
只返回常量。冒号:
创建数组,例如
c = 5;
N = 1:c
1 2 3 4 5
为冒号操作符提供相同的start-和endpoint显然只返回该点。
第二:操作总数与元素数量成正比,而不是矩阵产品的实际结果(实际上是无关紧要的,我们只对时间感兴趣) 。因此,首先要计算 FL oating点 O 的总数。
还记得我们使用过tic/toc
吗?好吧,也许我们应该找出总时间是多少,它存储在prod_time
中。这是执行矩阵乘法所花费的秒数。将Totflops
除以prod_time
会为您提供 FL oating点 O 操作 P er S 第二,即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 RAM和i5 750 2.66GHz)提供flops = 1.0617e+10