it's possible to velocize this loop?
    조회 수: 7 (최근 30일)
  
       이전 댓글 표시
    
orig=Sis(i).dailyprof;
xx=orig;
yy=Sis(i).Ntradess;
x1=find(xx);
last=-1;
for i=numel(x1):-1:1
  if yy(x1(i))~=last
      last=yy(x1(i));
      xx(x1(i))
      xx(x1(i))=xx(x1(i))-k;
      xx(x1(i))
  end     
end    
class(xx) double
class(YY) double
%%CHECK!
%k=[orig xx yy];
댓글 수: 1
  ProblemSolver
      
 2023년 8월 18일
				
      편집: Walter Roberson
      
      
 2023년 8월 18일
  
			Please read this and ask your question again properly:
채택된 답변
  Bruno Luong
      
      
 2023년 8월 18일
        
      편집: Bruno Luong
      
      
 2023년 8월 18일
  
      @piero Your question/code is awfully asked: no comment, no description, cannot run as it is, debug code left over, etc....
load('matlab_orig.mat')
load('matlab_yy.mat')
xx = orig;
k = 100;
x1 = find(xx);
last=-1;
for i=numel(x1):-1:1
  if yy(x1(i))~=last
      last=yy(x1(i));
      xx(x1(i))=xx(x1(i))-k;
  end     
end
xx2 = orig;
x1 = find(xx2);
yyx1 = yy(x1);
last = x1([diff(yyx1(:))~=0; true]);
xx2(last) = xx2(last) - k;
isequal(xx, xx2)
추가 답변 (1개)
  ProblemSolver
      
 2023년 8월 18일
        However, to the understanding what you are looking for is VECTORIZING the loop:
First, you should change 'find to logical indexing:
x1 = logical(orig);
Then, pre-allocate xx and yy to avoid repeated memory allocations:
xx = zeros(size(orig));
yy = zeros(size(orig));
The MAIN part I guess what you are looking for:
last = [0; yy(x1(1:end-1))]; 
mask = [yy(x1) ~= last];
xx(x1) = orig(x1) - k;
xx(x1(mask)) = xx(x1(mask)) - k;
Now you can use bsxfun to vectorize the difference operation:
mask = [true; diff(yy(x1))~=0]; 
xx(x1) = orig(x1) - k*double(bsxfun(@times, mask, ones(sum(x1),1)));
For optimization, the class checks should be avoided and just use 'double'
xx = double(zeros(size(orig)));
yy = double(zeros(size(orig)));
참고 항목
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!


