将数据输入双重使用循环
Inputting data into a double using loop
我在使用循环将数据输入双精度数时遇到了一个小问题。当循环开始时,double(称为 M)是空的。我想将另一个双精度数据(称为 C,C 只有 1 列)输入 M一次一列。我知道 M 中会有 12 列 我不知道我会有多少行。为了简单起见,假设我在 C 中有 123 行。我试过这样的事情:
M=double.empty;
for b=1:12
<loop to do some computation to create C>
for a=1:size(C,1)
M(1+end,b)=C(a,1)
end
end
end
这里的问题是b = 1时b的循环,一切正常。但是,当 b=2 时,数据将从 M(123+1,2) 开始。因此,M(1:123,2)=0's。谁能告诉我如何以条目始终从第一行开始的方式将数据输入 M(即,space 中没有零)?我猜问题出在 1+end
但我不知道如何解决它。
编辑:完整代码:
for b=1:length(conds_BOLD)
for c=1:length(subj_CTL)
PPI_comp_CTL_file=spm_select('FPList',fullfile(maindir,'PPI_component',config,roi_list{a},type,roi_format),...
sprintf('^%s_%s_%s.*\.mat$',subj_CTL{c},roi_list{a},conds_PPI{b}));
PPI_comp_CTL_data=load(PPI_comp_CTL_file);
for d=1:size(PPI_comp_CTL_data.est,1)
M_PPI_CTL(1+end,b)=PPI_comp_CTL_data.est(d,1);
end
end
end
如果我正确理解你的问题,下面的微不足道的修改将使你的代码工作。
M=double.empty;
for b=1:12
<some computation to create C>
for a=1:size(C,1)
M(a,b)=C(a,1) %modified here
end
end
当你做1+end
时,end
关键字会根据M
矩阵在那个时刻的大小来确定索引。因此,在第一次迭代中,end=0
,然后当b=2
,end=size(M,1)
。
更快的方法:
M=double.empty;
for b=1:12
<some computation to create C>
M(:,b)=C;
end
如果您能详细说明如何计算 C
,它可以变得更快。此外,不要将 M
分配为空矩阵,而是执行以下操作:
M=zeros(size(C,1),12);
当 C
的大小增加时,您会发现速度有很大差异。
OP 编辑问题后更新代码:
for b=1:12
count=0;
for c=1:N
<<code which generates a new C every time>>
M(count+1:count+size(C,1),b)=C;
count=count+size(C,1);
end
end
希望上面的代码片段对你有用。
我在使用循环将数据输入双精度数时遇到了一个小问题。当循环开始时,double(称为 M)是空的。我想将另一个双精度数据(称为 C,C 只有 1 列)输入 M一次一列。我知道 M 中会有 12 列 我不知道我会有多少行。为了简单起见,假设我在 C 中有 123 行。我试过这样的事情:
M=double.empty;
for b=1:12
<loop to do some computation to create C>
for a=1:size(C,1)
M(1+end,b)=C(a,1)
end
end
end
这里的问题是b = 1时b的循环,一切正常。但是,当 b=2 时,数据将从 M(123+1,2) 开始。因此,M(1:123,2)=0's。谁能告诉我如何以条目始终从第一行开始的方式将数据输入 M(即,space 中没有零)?我猜问题出在 1+end
但我不知道如何解决它。
编辑:完整代码:
for b=1:length(conds_BOLD)
for c=1:length(subj_CTL)
PPI_comp_CTL_file=spm_select('FPList',fullfile(maindir,'PPI_component',config,roi_list{a},type,roi_format),...
sprintf('^%s_%s_%s.*\.mat$',subj_CTL{c},roi_list{a},conds_PPI{b}));
PPI_comp_CTL_data=load(PPI_comp_CTL_file);
for d=1:size(PPI_comp_CTL_data.est,1)
M_PPI_CTL(1+end,b)=PPI_comp_CTL_data.est(d,1);
end
end
end
如果我正确理解你的问题,下面的微不足道的修改将使你的代码工作。
M=double.empty;
for b=1:12
<some computation to create C>
for a=1:size(C,1)
M(a,b)=C(a,1) %modified here
end
end
当你做1+end
时,end
关键字会根据M
矩阵在那个时刻的大小来确定索引。因此,在第一次迭代中,end=0
,然后当b=2
,end=size(M,1)
。
更快的方法:
M=double.empty;
for b=1:12
<some computation to create C>
M(:,b)=C;
end
如果您能详细说明如何计算 C
,它可以变得更快。此外,不要将 M
分配为空矩阵,而是执行以下操作:
M=zeros(size(C,1),12);
当 C
的大小增加时,您会发现速度有很大差异。
OP 编辑问题后更新代码:
for b=1:12
count=0;
for c=1:N
<<code which generates a new C every time>>
M(count+1:count+size(C,1),b)=C;
count=count+size(C,1);
end
end
希望上面的代码片段对你有用。