%% 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循环的功能?
答案 0 :(得分:2)
我们遇到的第一个问题是Nvec = logspace(100,nmax)
。这里最明显的问题是logspace(a,b)
会返回跨越[10^a, 10^b]
的值。在你的情况下,我怀疑你有足够的RAM来存储10^(2*nmax) = 1e6238
浮点值(比DBL_MAX
大约6000个数量级!)另一个问题是logspace
几乎会肯定会返回非整数值,因此您需要对结果进行舍入,以便使用这些值来定义矩阵。试试这个:
Nvec = floor(logspace(log10(100),log10(nmax)));
你也遇到了循环索引的问题。当lutimes(i)
被认为是i
和100
之间的值时,您会将值存储到nmax
。这没有意义。而是迭代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
不存在。