MATLAB Answers

Need help with a for loop implementation for the below code

2 views (last 30 days)
Kevin Akash Rajasekaran
Kevin Akash Rajasekaran on 16 Apr 2021
Answered: Walter Roberson on 16 Apr 2021
Greetings! I'm currently working on a project where in I perform a number of operations on a stimulus file (fancy name for a .mat file). The file consists of multiple trials and as of now, the following code is able to successfully carry out the process one trial at a time. I tried automating this code for all trials with the following but throws out this particular error:
N-dimensional indexing allowed for full matrices only
Can anyone help me debug the code. It's been bugging (!) me all day and I'm still not sure where I'm going wrong. Here's the code for reference:
function map = mkSaliencyMap(d,trialIds,varargin)
binsz = 0.1;
sdev = 2.0;
dt = 0.020;
for itrial = (trialIds)
if nargin < 3
trialIds = 1:d.numTrials;
end
eyedata = d.meta.image.filename('time',Inf).data;
eye = d.eye(trialIds(itrial));
t0 = d.meta.cic.firstFrame('trial',trialIds(itrial));
% Determining the start and end times at which the image is displayed
[tstarttime,tr,frame,dta] = d.meta.image.startTime('trial',trialIds(itrial));
[tstoptime, tr, frame, dta] = d.meta.image.stopTime('trial',trialIds(itrial));
% Removing eyetraces before and after the image is displayed
blink = false(size(eye.t));
blink = blink | eye.t < tstarttime-t0;
blink = blink | eye.t > tstoptime-t0;
% Defining deformities in the plot as a result of blinks
[tstart,tr,frame,dta] = d.meta.edf.STARTBLINK('trial',trialIds(itrial));
tend = d.meta.edf.ENDBLINK('trial',trialIds(itrial));
% Iterating over each blink datapoint
tstart = tstart - t0 - dt
tend = tend - t0 + dt
if max(tend) < max(tstart)
tend = [tend, Inf];
end
if min(tstart) > min(tend) % must be missing a start event
tstart = [-Inf, tstart];
end
assert(numel(tstart) == numel(tend),'STARTBLINK/ENDBLINK event mismatch!');
for itrial = 1:length(tstart)
blink = blink | eye.t > tstart(itrial) & eye.t < tend(itrial);
end
% Defining the original dimensions of the image
width = d.meta.image.width('trial', trialIds(itrial), 'time', Inf).data
height = d.meta.image.height('trial', trialIds(itrial), 'time', Inf).data
sz = ceil([height, width]./binsz); % size of the saliency map
x0 = floor(sz(2)/2)+1;
y0 = floor(sz(1)/2)+1; % Co-ordinates of the screen centre
% Removing eyetraces which are negative integers
blink = blink | (ceil(eye.x/binsz)+x0 <= 0) | (ceil(eye.x/binsz)+x0 >= sz(2));
blink = blink | (ceil(eye.y/binsz)+y0 <= 0) | (ceil(eye.y/binsz)+y0 >= sz(1));
% Assigning NaN values to all blink datapoints for trial 1
eye.x(blink) = NaN;
eye.y(blink) = NaN;
% Creating a sparse matrix of the eyetraces with the blinks removed
map(:,:,itrial) = sparse(ceil(eye.y(~blink)/binsz)+y0,ceil(eye.x(~blink)/binsz)+x0,1,sz(1),sz(2));
map(:,:,itrial) = full(map(:,:,itrial));
map(:,:,itrial) = imgaussfilt(map(:,:,itrial),sdev); % Gaussian filter with stdev = 2
end
end
  3 Comments
Walter Roberson
Walter Roberson on 16 Apr 2021
What class() are the inputs?
At the time of the error, what are size() of each of the variables mentioned on the line ?

Sign in to comment.

Answers (2)


Walter Roberson
Walter Roberson on 16 Apr 2021
map(:,:,itrial) = sparse(ceil(eye.y(~blink)/binsz)+y0,ceil(eye.x(~blink)/binsz)+x0,1,sz(1),sz(2));
The right hand side appears to be a normal sparse array. However, sparse arrays cannot be assigned to a three dimensional array. For example
>> map(:,:,1) = sparse(1,1,1)
N-dimensional indexing allowed for full matrices only.
You will need to recode, such as
map(:,:,itrial) = full(sparse(ceil(eye.y(~blink)/binsz)+y0,ceil(eye.x(~blink)/binsz)+x0,1,sz(1),sz(2)));
in which case you can skip the next line
map(:,:,itrial) = full(map(:,:,itrial)); %no longer needed
You cannot mix sparse and full in the same array, by the way.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!