1

我需要创建一个二维数组的一维数组,以便程序可以分别读取每个二维数组。

我有一个包含 5 列的大型数组,第二列存储“标记”数据。根据标记值,我需要从剩余的 4 列中取出相应的数据,并将它们单独放入一个新数组中。

我正在考虑运行两个 for 循环,一个用于获取目标数据并将其写入一维数组中的一个单元格,另一个用于逐行读取初始数组,寻找标记。

我觉得这是一个相当简单的问题,我只是无法弄清楚如何从本质上剪切和粘贴数组的某些部分并将它们写入新的部分。

提前致谢。

4

2 回答 2

1

不需要for 循环,将您的标记与逻辑索引一起使用。例如,如果您的数组是A

B=A(A(:,2)==marker,[1 3:5]) 

将选择存在标记的所有行,没有第二列。然后您可以使用reshapeor(:)运算符将其设为一维,例如

B=B(:)

或者,如果您想要单线:

B=reshape(A(A(:,2)==marker,[1 3:5]),1,[]); 
于 2013-06-24T03:19:45.463 回答
0

我只是在回答我自己的问题,以向任何潜在的未来用户展示我最终提出的解决方案。

%=======SPECIFY CSV INPUT FILE HERE========
MARKER_DATA=csvread('ESphnB2.csv');                        % load data from csv file
%===================================

A=MARKER_DATA(:,2);                                         % create 1D array for markers
A=A';                                                       % make column into row

for i=1:length(A)                                           % for every marker
    if A(i) ~= 231                                          % if it is not 231 then
        A(i)=0;                                             % set value to zero
    end
end

edgeArray = diff([0; (A(:) ~= 0); 0]);                      % set non-zero values to 1
ind = [find(edgeArray > 0) find(edgeArray < 0)-1];          % find indices of 1 and save to array with beginning and end

t=1;                                                        % initialize counter for trials
for j=1:size(ind,1)                                         % for every marked index
    B{t}=MARKER_DATA(ind(j,1):ind(j,2),[3:6]);              % create an array with the rows from the data according to indicies
    t=t+1;                                                  % create a new trial
end

gazeVectors=B';                                             % reorient and rename array of trials for saccade analysis

%======SPECIFY MAT OUTPUT FILE HERE===
save('Trial_Data_2.mat','gazeVectors');                       % save array to mat file
%=====================================
于 2013-07-31T01:29:58.880 回答