2014-09-11 2 views
1

MATLAB 내에서 숫자를 메모리에 저장하는 것이 가장 좋은 방법이지만 for 루프 중에 행렬/배열에 특정 하위 세트 만 쓰는 것이 가장 좋습니다. 또한 설정에 대한 루프 내 문제에 대한 적절한 고군분투하고있다 :MATLAB에 임시로 번호 저장

http://i.stack.imgur.com/yPAAn.png

나는 특정 길이 (X = 100)의 선, 그리고 특정 위치 (POS = 50)에서 장벽이있다. 여러 라운드의 샘플링 (이 경우 1000 회)을 수행하고 각 샘플 내에서 특정 양의 난수 (p)를 생성합니다. 표시된 이미지에서 4 개의 숫자가 생성됩니다. p> pos 일 때 가장 작은 숫자를 취하고 p < pos 일 때 가장 큰 숫자를 취해 포물선을 빼서 그 장벽을 포함하는 가능한 작은 조각 사이의 거리를 알려줍니다. 그래서이 예제에서는 b와 c 사이의 거리를 제공합니다.

MATLAB에서 가능합니까?

x = 100; 
sample = 1000; %number of rounds of sampling to do 
pos = 50; %position of barrier 
nn = 1:12; %the number of random numbers to generate for each round of sampling i.e. 1000 rounds generating 1 number, 1000 rounds generating 2 numbers and so on 
len1 = 0; 
len2= x ; 
for i = 1:sample 
    p(i) = int16(rand()*x) 
    if (p(i)<pos) && (p(i)>len1) 
     len(i) = p(i) 
    end 
end 

내가

if (p(i)>pos) && (p(i)<len2) 

내 생각의 라인을 따라 문을 일시적으로 작은으로 LEN1 및 LEN2의 값을 대체 할 수 있다면 두 번째 필요할 것 알고 : 나는 지금까지 같이있어 루프가 기본 len1 및 len2 값으로 다시 시작되기 전에 각 샘플링 라운드 중에 생성되는 최대 수입니다. 그래도 더 좋은 방법이있을 수 있습니다. 내가 제대로 문제를 이해한다면

어떤 도움은 매우 극명하게 될 것이다

,

+0

생성 된 모든 난수가 장벽의 한쪽면에 있으면 어떻게됩니까? –

+0

죄송합니다 -이 사건을 언급하는 것을 잊었습니다. 이 경우 len1 또는 len2의 원래 값은 여전히 ​​남아 있으며 빼기에 사용됩니다. 따라서 'b'만 생성 된 숫자라면 출력은 100-b가됩니다. – AnnaSchumann

+0

변수'nn'은 무엇을합니까? 당신이 사용하지 않는 것 같습니다. 또한 변수'sam'은 무엇입니까? 그것은 '샘플'과 같은가요? –

답변

0

, 당신이 당신의 질문에있는 모든 점을 해결하지 않는이

x = 100;  % length of the grid 
pos = 50;  % position of the barrier 
len1 = 0;  % left edge of the grid 
len2 = x;  % right edge of the grid 

sample = 1000; % number of samples to make 
nn  = 1:12 % number of points to generate (will loop over these) 

len = zeros(sample, length(nn)); % array to record the results 

for n = 1:length(nn)      % For each number of pts to generate 
    numpts = nn(n); 
    for i = 1:sample      % For each round of sampling, 
     p = round(rand(numpts,1) * x); % generate 'numpts' random points. 
     if any(p>pos)     % If any are to the right of the barrier, 
      pright = min(p(p>pos));  % pick the smallest. 
     else 
      pright = len2; 
     end 
     if any(p<pos)     % If any are to the left of the barrier, 
      pleft = max(p(p<pos));  % pick the largest. 
     else 
      pleft = len1; 
     end 
     len(i,n) = pright - pleft;  % Record the length of the interval. 
    end 
end 
+0

좋아요! 이것은 완벽합니다. 이것은 나에게 많은 것을 가르쳐 왔으며 특히 중첩 된 for-loops에 관해서 많이 가르쳐 왔습니다. – AnnaSchumann

0

같은 (가장 좋은 방법을해야 숫자를 일시적으로 저장하는 방법), 임의의 숫자 목록이 있으면 주어진 숫자의 가장 가까운 두 숫자를 얻는 방법에 대한 벡터화 된 접근법을 보여줍니다. 내가 말할 수있는 한 그것은 당신이 요구하는 것의 일부입니다.

n = 1000;   %// Number of random numbers 
max_val = 100; %// Max value 
min_val = 0;  %// Min value 
p = 50;   %// Border 

x = rand(n,1)*(max_val-min_val)+min_val; %// Vector of random numbers 
s = sort([min_val; x; max_val]-p);  %// Sort vector, with border "shifted" to 0 
ind = find(diff(sign(s)));  %// Find index of closest number smaller than p 
res = diff(s(ind:ind+1)) %// Difference between closest numbers on each side of p 
+0

이것은 정말로 흥미 롭습니다. 추가해 주셔서 감사합니다. 나는 당신이 그렇게 할 수 있다는 것을 전혀 모르고있었습니다. – AnnaSchumann