FLOPS的线性求解

问题描述 投票:0回答:1

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

matlab
1个回答
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不存在。

© www.soinside.com 2019 - 2024. All rights reserved.