我有一个声明如下的单元格数组:
testCellArray = cell(m, n);
在脚本中,我指定每个单元格的值如下:
for loop (ii)
testCellArray{ii, 1} = str2num(value1{ii});
testCellArray{ii, 2} = str2num(value2{ii});
testCellArray{ii, 3} = str2num(value3{ii});
testCellArray{ii, 4} = str2num(value4{ii});
...
testCellArray{ii, n} = str2num(valuen{ii});
end
我无法把它放在一行(我很确定它是可能的)。
我尝试过这样的事情:
testCellArray{ii, :} = deal(str2num(value1{ii}, value2{ii}, value3{ii}, value4{ii}, ..., valuen{ii}))
但它不起作用。我也不确定是否应该使用testCellArray{ii, :}
或testCellArray(ii, :)
。
答案 0 :(得分:3)
更好的方法可能是使用str2double
而不是str2num
,因为它还需要一个单元格数组作为输入。
您可以按照以下方式排列分配,而不使用外部ii
循环:
testCellArray(:,1) = num2cell(str2double(value1));
testCellArray(:,2) = num2cell(str2double(value2));
...
testCellArray(:,n) = num2cell(str2double(valuen));
而且,如果你的变量真的被命名为value1
,value2
等,我无法抗拒推荐:
摆脱枚举变量名称并将事物放入列表中,在这种情况下可能是一个单元格数组。
如果您确实需要/想要保持循环,您的交易分配的正确版本将是:
[testCellArray{ii, :}] = deal(str2num(value1{ii}), str2num(value2{ii}), ..., str2num(valuen{ii}));
然而,不知道n
有多大,将它放在一条巨大的线而不是几条较短的线上肯定不是很好的编码风格。
答案 1 :(得分:2)
假设value1
,value2
等是字符串的垂直单元格数组:
testCellArray = num2cell([str2num(strvcat(value1{:})) str2num(strvcat(value2{:}))]);
请注意strvcat
可以处理不同长度的字符串。
示例:
>> value1 = {'1';'2';'3';'14'};
>> value2 = {'5';'6';'7';'182'};
>> testCellArray = num2cell([str2num(strvcat(value1{:})) str2num(strvcat(value2{:}))])
testCellArray =
[ 1] [ 5]
[ 2] [ 6]
[ 3] [ 7]
[14] [182]
如果所有value1
,value2
等都集中在一个2D单元格数组中,则会更加方便,例如:
value = {'1' '5' '-1';
'2' '6' '-2';
'3' '7' '-3';
'14' '182' '-4'}; %// arbitrary number of columns
这样您就不必修改代码来容纳不同数量的列。只需使用
testCellArray = num2cell(reshape(str2num(strvcat(value{:})), size(value)));
或等效
testCellArray = mat2cell(str2double(value), ones(1,size(value,1)), ones(1,size(value,2)) );
获得结果
testCellArray =
[ 1] [ 5] [-1]
[ 2] [ 6] [-2]
[ 3] [ 7] [-3]
[14] [182] [-4]
答案 2 :(得分:1)
只有一条指令的解决方案:
testCellArray = cellfun(@str2num, [value1(:),value2(:),value3(:),...
,valuen(:)],'UniformOutput',false));
如果所有值*都是向量矢量,则可以取出(:)
。