Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F97791137
subsref.m
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Mon, Jan 6, 10:31
Size
5 KB
Mime Type
text/x-Algol68
Expires
Wed, Jan 8, 10:31 (1 d, 23 h)
Engine
blob
Format
Raw Data
Handle
23395957
Attached To
R10025 iCAPs public version 2
subsref.m
View Options
function
varargout
=
subsref
(
this
,
subs
)
%
SUBSREF
Subscripted
reference
%
An
overloaded
function
...
%
_________________________________________________________________________
%
Copyright
(
C
)
2008
-
2013
Wellcome
Trust
Centre
for
Neuroimaging
%
Vladimir
Litvak
,
Stefan
Kiebel
%
$Id:
subsref
.
m
6600
2015
-
11
-
12
13
:
07
:
41
Z
christophe
$
if
isempty
(
subs
)
return
;
end
if
this
.
Nsamples
==
0
error
(
'
Attempt
to
reference
a
field
of
an
empty
meeg
object
.
'
);
end
switch
subs
(
1
).
type
case
'
()
'
if
~
islinked
(
this
),
error
(
'
The
object
is
not
linked
to
data
file
'
);
end
if
numel
(
subs
)
~=
1
,
error
(
'
Expression
too
complicated
'
);
end
if
this
.
montage
.
Mind
==
0
varargout
=
{
double
(
subsref
(
this
.
data
,
subs
))};
else
Mem_max
=
200
*
2
^
20
;
%
Limit
memory
usage
to
about
200
Mb
vect_fl
=
0
;
dat3D
=
0
;
dim
=
size
(
this
);
if
numel
(
dim
)
>
2
&&
dim
(
3
)
>
1
%
assume
at
most
3
D
data
dat3D
=
1
;
end
if
ischar
(
subs
.
subs
{
1
})
%
need
to
handle
the
case
of
a
':'
argument
if
~
strcmp
(
subs
.
subs
{
1
},
':'
),
error
(
'
This
shouldn
''
t
happen
....
'
);
end
if
length
(
subs
.
subs
)
==
1
chanidx
=
1
:
dim
(
1
);
subs
.
subs
{
2
}
=
':'
;
if
dat3D
,
subs
.
subs
{
3
}
=
':'
;
end
vect_fl
=
1
;
else
chanidx
=
1
:
dim
(
1
);
end
else
chanidx
=
subs
.
subs
{
1
};
end
%
check
if
correct
channel
index
if
any
(
chanidx
>
nchannels
(
this
))
error
(
'
channel
index
higher
than
number
of
channels
in
current
montage
'
)
end
%
get
corresponding
rows
of
'
tra
'
matrix
traidx
=
this
.
montage
.
M
(
this
.
montage
.
Mind
).
tra
(
chanidx
,
:
);
%
change
subs
to
use
only
the
necessary
channels
from
data
lchan_o
=
find
(
any
(
traidx
,
1
));
subs
.
subs
{
1
}
=
lchan_o
;
%
need
to
handle
the
case
of
':'
arguments
if
ischar
(
subs
.
subs
{
2
})
if
~
strcmp
(
subs
.
subs
{
2
},
':'
),
error
(
'
This
shouldn
''
t
happen
....
'
);
end
subs
.
subs
{
2
}
=
1
:
dim
(
2
);
Ntb
=
dim
(
2
);
else
Ntb
=
length
(
subs
.
subs
{
2
});
end
if
dat3D
&&
ischar
(
subs
.
subs
{
3
})
if
~
strcmp
(
subs
.
subs
{
3
},
':'
),
error
(
'
This
shouldn
''
t
happen
....
'
);
end
subs
.
subs
{
3
}
=
1
:
dim
(
3
);
end
Mem_load
=
8
*
Ntb
*
length
(
lchan_o
);
if
Mem_load
<=
Mem_max
%
small
chunk
loaded
if
dat3D
subs_c
=
subs
;
for
ii
=
1
:
numel
(
subs
.
subs
{
3
})
subs_c
.
subs
{
3
}
=
subs
.
subs
{
3
}(
ii
);
varargout
{
1
}(
:
,
:
,
ii
)
=
...
traidx
(
:
,
lchan_o
)
*
double
(
subsref
(
this
.
data
,
subs_c
));
end
else
varargout
=
{
traidx
(
:
,
lchan_o
)
*
double
(
subsref
(
this
.
data
,
subs
))};
end
else
%
otherwise
split
data
reading
into
chunks
Ntb_chunk
=
round
(
Mem_max
/
length
(
lchan_o
)
/
8
);
Nchunk
=
ceil
(
Ntb
/
Ntb_chunk
);
varargout
{
1
}
=
zeros
(
length
(
chanidx
),
Ntb
);
for
ii
=
1
:
Nchunk
subs_ch
=
subs
;
if
ii
<
Nchunk
ll
=
(
1
:
Ntb_chunk
)
+
(
ii
-
1
)
*
Ntb_chunk
;
else
ll
=
((
ii
-
1
)
*
Ntb_chunk
+
1
)
:
Ntb
;
end
subs_ch
.
subs
{
2
}
=
subs_ch
.
subs
{
2
}(
ll
);
if
dat3D
for
jj
=
1
:
numel
(
subs
.
subs
{
3
})
subs_ch
.
subs
{
3
}
=
subs
.
subs
{
3
}(
jj
);
varargout
{
1
}(
:
,
ll
,
jj
)
=
...
traidx
(
:
,
lchan_o
)
*
double
(
subsref
(
this
.
data
,
subs_ch
));
end
else
varargout
{
1
}(
:
,
ll
)
=
...
traidx
(
:
,
lchan_o
)
*
double
(
subsref
(
this
.
data
,
subs_ch
));
end
end
end
if
vect_fl
,
varargout
{
1
}
=
varargout
{
1
}(
:
);
end
end
case
'
{}
'
case
'.'
if
ismethod
(
this
,
subs
(
1
).
subs
)
if
numel
(
subs
)
==
1
varargout
=
{
feval
(
subs
(
1
).
subs
,
this
)};
elseif
(
numel
(
subs
)
==
2
)
&&
isequal
(
subs
(
2
).
type
,
'
()
'
)
varargout
=
{
feval
(
subs
(
1
).
subs
,
this
,
subs
(
2
).
subs
{
:
})};
elseif
(
numel
(
subs
)
>
2
)
&&
isequal
(
subs
(
2
).
type
,
'
()
'
)
varargout
{
1
}
=
builtin
(
'
subsref
'
,
...
feval
(
subs
(
1
).
subs
,
this
,
subs
(
2
).
subs
{
:
}),
subs
(
3
:
end
));
else
varargout
{
1
}
=
builtin
(
'
subsref
'
,
feval
(
subs
(
1
).
subs
,
this
),
subs
(
2
:
end
));
end
elseif
isfield
(
this
.
other
,
subs
(
1
).
subs
)
field
=
getfield
(
this
.
other
,
subs
(
1
).
subs
);
if
numel
(
subs
)
==
1
varargout
=
{
field
};
else
varargout
{
1
}
=
builtin
(
'
subsref
'
,
field
,
subs
(
2
:
end
));
end
else
error
(
'
Reference
to
non
-
existent
or
private
meeg
method
or
field
.
'
);
end
otherwise
error
(
'
Unfamiliar
referencing
type
'
);
end
Event Timeline
Log In to Comment