resize and fill the matrix

24 次查看(过去 30 天)
EK
EK 2023-9-30
评论: Voss 2023-9-30
Hi,
I am trying to resize Excel data matrix and would like to ask if there are easy way to do it in matlab
I have matrices with logfile and data. The first 4 columns is the log fille that logs stimuli representation in time (an example, attached below ). The rows are time and the columns are events. The first column logs stimuli id in time. (No stimulus =0, stimulus : 1 2 3 4 5 or 6) The second column logs the stimulus presentation time and its duration (0= No stimulus, 2=Stimulus); column 3 logs duration and ID of each trial. I need to take given number of raws before and after each stimulus for each trial. For example, 60 rows before stimulus, and 40 rows after the stimulus and reconcatinate the matrix in the same order it was before. I also need to mark in the column 2 Pre stimulus interval ==1 (e.g 60 rows before stimulus == 1) and the Post stimulus interval (e.g 40 rows in after the stimulus == 3) as in example file below. Could anyone help with this? I am attaching logfile and the example files
  2 个评论
Voss
Voss 2023-9-30
This sounds similar to your other question:
Does my recent answer to that question also solve this question? Or are they different tasks?
EK
EK 2023-9-30
It is a bit different here althaough the files are the same. I need to cut trials duration taking given number of raws before and after each stimulus for each trial, fill them with numbers and concatinate back. In some files I do not have trial id log (colomn3) and I need to add stages (Pre stimulus, poststimulus interval) based on number of rows I take before and after the stimulus

请先登录,再进行评论。

采纳的回答

Voss
Voss 2023-9-30
编辑:Voss 2023-9-30
Try this. It looks for stimulus data (a contiguous section with 2's in column 2), and takes 60 rows before the start and 40 rows after the end of that, and puts the 1's and 3's in place before and after the stimulus section, respectively. It continues doing that until no more stimulus sections are found, then concatenates the sections into a single matrix and writes it to file.
Note that no care is taken to handle the case where 60 rows before stimulus starts is within the previous trial (or before the beginning of the data) or where 40 rows after stimulus ends is within the next trial (or after the end of the data).
input_file = 'logfile-30-9-23.xlsx';
output_file = 'logfile-30-9-23_modified.xlsx';
stim_column = 2;
prestim_value = 1;
stim_value = 2;
poststim_value = 3;
nrows_pre = 60;
nrows_post = 40;
% read input file:
data = readmatrix(input_file);
% initialize empty cell array that will contain trials' data (one trial per cell):
new_data = {};
% start with row 1:
row = 1;
% look for new stimulus data as long as you can:
while true
% find the next stimulus start row:
start_idx = row - 1 + find(data(row:end,stim_column) == stim_value, 1);
% if there is none, we're done, and break out of the loop:
if isempty(start_idx)
break
end
% find the stimulus end row:
end_idx = start_idx - 1 + find(data(start_idx:end,stim_column) ~= stim_value, 1) - 1;
% grab the stimulus data plus 60 rows before and 40 rows after:
trial_data = data(start_idx-nrows_pre:end_idx+nrows_post,:);
% put the pre-stimulus values in place at the beginning:
trial_data(1:nrows_pre,stim_column) = prestim_value;
% put the post-stimulus values in place at the end:
trial_data(end-nrows_post+1:end,stim_column) = poststim_value;
% store the trial's data in the new_data cell array:
new_data{end+1} = trial_data;
% update the row where we'll start looking for the next stimulus section:
row = end_idx + nrows_post + 1;
end
% concatenate the trials' data into a single numeric matrix:
new_data = vertcat(new_data{:});
% write to file:
writematrix(new_data,output_file);

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Programming 的更多信息

产品


版本

R2022a

Community Treasure Hunt

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

Start Hunting!

Translated by