Need help with a for loop implementation for the below code

2 visualizaciones (últimos 30 días)
Kevin Akash Rajasekaran
Kevin Akash Rajasekaran el 16 de Abr. de 2021
Respondida: Walter Roberson el 16 de Abr. de 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 comentarios
Kevin Akash Rajasekaran
Kevin Akash Rajasekaran el 16 de Abr. de 2021
The last part part of the code dealing with the sparse matrix maps i.e
map(:,:,itrial) = sparse(ceil(eye.y(~blink)/binsz)+y0,ceil(eye.x(~blink)/binsz)+x0,1,sz(1),sz(2));
Walter Roberson
Walter Roberson el 16 de Abr. de 2021
What class() are the inputs?
At the time of the error, what are size() of each of the variables mentioned on the line ?

Iniciar sesión para comentar.

Respuestas (2)

Jan
Jan el 16 de Abr. de 2021
Multi-dim sparse arrays are not implemented in Matlab. Try to omit the sparse() .

Walter Roberson
Walter Roberson el 16 de Abr. de 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.

Categorías

Más información sobre Performance and Memory en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

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

Start Hunting!

Translated by