FLOPS的线性求解

时间:2018-03-02 23:19:41

标签: matlab

enter image description here

%% 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循环的功能?

1 个答案:

答案 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)被认为是i100之间的值时,您会将值存储到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不存在。

相关问题