Trying to randomly permute a time series, error with time point
    조회 수: 4 (최근 30일)
  
       이전 댓글 표시
    
Dear Matlab,
I have an EEG signal, which I ran through wavelet convolution to produce a 3D matrix of time-frequency values, that is:
1 X 68(frex) X 4000(time points)
GOAL: Now the next step is to randomly slice the tf matrix and reoder time zero (and effectively reorder the map, to 'shuffle' it), by running the tf map/variable through 1000 rounds of permutations. 
(see code below here, and attached tf mat file to run it):
% PERMING power values
num_iterations = 1000;
permuted_results = zeros(num_iterations,length(frex),length(times2));%zeros(1,num_iterations);
for ni=1:num_iterations
    % randomly resort power values
    cutpoint = times2(randi(numel(times2)));
    permuted_results(ni,:,:,:) = tf(:,:,[ cutpoint:end 1:cutpoint-1 ]);
end
PROBLEM: when I run the for loop, I get this error:
        Index in position 3 is invalid. Array indices must be positive integers or logical values.
Is it because the time series, which goes from -1000 to 3000 milliseconds, is it the negative values in there?
Thanks very much in advance for any help/guidance!
Best,
Joanne
댓글 수: 2
  Dyuman Joshi
      
      
 2023년 5월 2일
				"Is it because the time series, which goes from -1000 to 3000 milliseconds, is it the negative values in there?"
Yes.
load('TFsample.mat')% PERMING power values
num_iterations = 1000;
permuted_results = zeros(num_iterations,length(frex),length(times2));%zeros(1,num_iterations);
for ni=1:num_iterations
    % randomly resort power values
    cutpoint = times2(randi(numel(times2)))
    permuted_results(ni,:,:,:) = tf(:,:,[ cutpoint:end 1:cutpoint-1 ]);
end
채택된 답변
  Constantino Carlos Reyes-Aldasoro
      
 2023년 5월 2일
        A=[1 2 3 4 5 6 7]
A(1:3)
A(-1:2)
Yes, Matlab needs the index of the position starting from 1, so if you use negative numbers there will be an error.
댓글 수: 6
  Dyuman Joshi
      
      
 2023년 5월 3일
				"How to fix?"
It depends on what you want to do. 
You can either use abs()
cutpoint = abs(times2(randi(numel(times2))))
or add 1001 to times2 (as suggested above) to adjust its values, which will change to 1 to 4001 (milliseconds).
times2 = times2 + 10001;
cutpoint = times(randi(numel(times2)))
%similar to the above two lines
cutpoint = randi(numel(times2))
추가 답변 (0개)
참고 항목
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!


