
%% Part A
% max value of N for an NxN matrix of floating point numbers
% 8GB of ram
Mb = 1600;
nmax = floor(sqrt((Mb*1024*1024)/160));
%%Part B
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
% Theoretical flops per second 2.4GHz Processor
tflops = 2.4*10^9 * 4 %flops per second
%% Part C
Nvec = logspace(100,nmax);
for i = Nvec
A = rand(i);
b = rand(i,1);
tic
x = A\b;
lutimes(i) = toc;
end
%y = logspace(nmax,100);
%%Part D
loglog(N,lutimes,'.')
hold on我收到一个关于达到最大变量大小的错误,并且不知道如何纠正它。此外,我意识到我还没有完成图表,但正在努力提前完成c部分。我需要改变我的for循环的工作方式吗?
发布于 2018-03-03 09:52:35
我们遇到的第一个问题是Nvec = logspace(100,nmax)。这里最突出的问题是logspace(a,b)返回跨[10^a, 10^b]的值。在您的情况下,我怀疑您是否有足够的内存来存储10^(2*nmax) = 1e6238浮点值(大约比DBL_MAX大6000个数量级!)另一个问题是,logspace几乎肯定会返回非整数值,因此您需要对结果进行舍入,以便使用这些值来定义矩阵。试着这样做:
Nvec = floor(logspace(log10(100),log10(nmax)));你还有一个循环索引的问题。当lutimes(i)应该是介于100和nmax之间的值时,您是在将值存储到i中。这没有任何意义。相反,按如下方式遍历Nvec的索引...
lutimes = zeros(size(Nvec));
for idx = 1:numel(Nvec)
A = rand(Nvec(idx));
b = rand(Nvec(idx),1);
tic
x = A\b;
lutimes(idx) = toc;
end最后,loglog(N,lutimes,'.')应该是loglog(Nvec,lutimes,'.'),因为N不存在。
https://stackoverflow.com/questions/49078848
复制相似问题