我希望使用参数func(par1,par2,par3)
,par1
和par2
的所有组合测试函数par3
,并将输出存储在.mat
文件中。我的代码目前看起来像这样:
n1 = 3;
n2 = 1;
n3 = 2;
parList1 = rand(1,n1); % n1,n2,n3 is just some integer
parList2 = rand(1,n2); % the lists are edited by hand in the actual script
parList3 = rand(1,n3);
saveFile = matfile('file.mat','Writable',true);
% allocate memory
saveFile.output = NaN(numel(parList1),numel(parList2),numel(parList3));
counter1 = 0;
for par1 = parList1
counter1 = counter1 + 1;
counter2 = 0; % reset inner counter
for par2 = parList2
counter2 = counter2 + 1;
counter3 = 0; % reset inner counter
for par3 = parList3
counter3 = counter3 + 1;
saveFile.output(counter1,counter2,counter3) = sum([par1,par2,par3]);
end
end
end
除非parList3
只有一个项目,例如n3 = 1
,否则此方法有效。然后saveFile.output
有单例尺寸,我得到错误
Variable 'output' has 2 dimensions in the file, this does not match the 3 dimensions in the indexing subscripts.
有没有一种优雅的方法来解决这个问题?
答案 0 :(得分:1)
for
语句中的表达式需要是行数组,而不是示例中的列数组。循环将在代码的第一个值之后退出。在saveFile.output
命令上设置断点以查看我的意思。 使用列数组,par1
不会是所需的标量,而是整个parList1
列。 使用行数组,par1
将按预期迭代parList1
的每个值
另一件事是你需要重置你的内部计数器(counter2
和counter2
),否则你的第二和第三维度会比你想象的要大。
n3=1
问题是预期的行为,因为matfile
定义了具有固定维数的变量,并将saveFile.output
视为2D。修复这些问题后,您可以通过更改行来解决n3=1
问题,
saveFile.output(counter1,counter2,counter3) = sum([par1,par2,par3]);
到
if n3==1, saveFile.output(counter1,counter2) = sum([par1,par2,par3]);
else saveFile.output(counter1,counter2,counter3) = sum([par1,par2,par3]);
end
答案 1 :(得分:0)
到目前为止,我意识到实际上在matfiles中,所有单例维度除了前两个都被删除了。
在我的实际程序中,我决定将数据线性保存在文件中,并通过使用函数sub2ind
和ind2sub
来避免matfile缺乏线性索引功能。