我目前正在寻找下面一段代码的建议,该代码由有效地循环遍历数据集(的单元格类型)并将每列提取为数据向量。
[i,j]=size(fimat);
k=2;
while k<=j % looping through columns
[num2str(k-1),'yr']=cell2mat(fimat(:,k)); %extract each column as vector
k=k+1;
end
无可否认,我的问题在于以下陈述:
[num2str(k-1),'yr']
正确连接数字(由变量k 反映)和字符串名称&#39; yr &#39;。但是,语法在分配实例(在第一次迭代期间)
时失败1yr=cell2mat(fimat(:,2))
产生的错误自言自语
Error: An array for multiple LHS assignment cannot contain LEX_TS_STRING.
但我仍然想办法做到这一点。因此,任何反馈都将受到赞赏。
由于
答案 0 :(得分:2)
首先,在matlab中,变量名不能以数字开头。您应该修改代码,使变量名以字母或下划线开头。
例如['yr' num2str(k-1)]
或['_' num2str(k-1) 'yr']
会更好。
然后,包括The Mathworks在内的所有人都非常强烈反对你要做的事情。使用单元格yr
并调用yr{k}
而不是迭代变量名称会好得多:
yr = cell(j,1);
for k = 2:j
yr{k-1} = cell2mat(fimat(:,k));
end
无论如何,如果您仍想这样做,可以使用eval
while k<=j
eval(['_' num2str(k-1) 'yr = cell2mat(fimat(:,k));']);
k=k+1;
end
最佳,
答案 1 :(得分:1)
您无法像以前那样动态创建变量名称。 =
的左侧必须是标识符,而不是char。我建议的替代方法是使用单元格数组而不是单个变量名。例如:
yr{k-1}=cell2mat(fimat(:,k))
如果您必须将变量名称与数字一起使用,我强烈建议您不要这样做,您必须使用eval
作为该行。我强烈建议您在使用eval
之前检查的替代方案是struct
,其中包含动态字段名称和containers.Map
答案 2 :(得分:0)
以下是我对问题的回答,以便进行分享。希望它会有所帮助,并感谢这篇文章的贡献者。
[i,j]=size(fimat); %get dimension of dataset (of cell type)
numdata=cell2mat(fimat(1:i,2:j)); %extract only numeric from dataset
for k=1:j-1
eval(sprintf('yr%d = numdata(:,k)', k));
end