How to make the code efficient?
    11 ビュー (過去 30 日間)
  
       古いコメントを表示
    
I have made the following code .
x=[0:n-1];
y=[0:n-1];
k = 0;
for i=1:n
    for j=1:n
         if rem(((y(j))^2)-((x(i))^3)-2*(x(i))-3,n)==0
            k = k+1;                                            
            xy_mtx(k,:) = [x(i) y(j)];                
        end
    end
end
I want to make it efficient, as efficient as it can be. Is this possible
0 件のコメント
回答 (3 件)
  David Hill
      
      
 2021 年 6 月 8 日
        n=10;
[x,y]=meshgrid(0:n-1);
idx=mod(y.^2-x.^3-2*x-3,n)==0;
xy_mtx=[x(idx),y(idx)];
4 件のコメント
  David Hill
      
      
 2021 年 6 月 8 日
				How large is your n? n cannot be much larger than 2e4 or else the matrices get too large (too much memory).
  David Hill
      
      
 2021 年 6 月 8 日
				
      編集済み: David Hill
      
      
 2021 年 6 月 8 日
  
			You could try the help memory suggestions to try to increase memory, or you could add nested for-loop and do the meshgrids in batches of 2e4 (will be slower). Also keep in mind floating point limitations.
n=1e6;
xy_mtx=[];
for k=1:50
  for j=1:50
     [x,y]=meshgrid(0+(k-1)*2e4:min(2e4-1+(k-1)*2e4,n-1),0+(j-1)*2e4:min(2e4-1+(j-1)*2e4,n-1));
     idx=mod(y.^2-x.^3-2*x-3,n)==0;
     xy_mtx=[xy_mtx;x(idx),y(idx)];
  end
end
  Joseph Cheng
      
 2021 年 6 月 8 日
        You can do things all at once cine you're not dependent on previous values.  
n=4
x=[0:n-1];
y=[0:n-1];
k = 0;
%%Orig_code
tic
for i=1:n
    for j=1:n
         if rem(((y(j))^2)-((x(i))^3)-2*(x(i))-3,n)==0
            k = k+1;                                            
            xy_mtx(k,:) = [x(i) y(j)];                
        end
    end
end
time1=toc;
tic
%%do everything at once
[X Y] = meshgrid(x,y); %generate combinations of x and y 
REMmat = rem((Y.^2)-(X.^3)-2*(X)-3,n); %perform all rem calculations at once
[indexies]=find(REMmat==0); %find which index has a rem of 0
xy_mtxM = [X(indexies) Y(indexies)]; %put only the X and Y comb. where rem above is -
time2=toc;
disp([xy_mtx xy_mtxM])
disp(['time original:' num2str(time1) 's'])
disp(['time new:' num2str(time2) 's'])
disp(['time delta:' num2str(time1-time2) 's'])
2 件のコメント
  Joseph Cheng
      
 2021 年 6 月 8 日
				hm... not sure why the time improvement above is worse but locally it appears much better
参考
カテゴリ
				Help Center および File Exchange で Loops and Conditional Statements についてさらに検索
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!



